본문 바로가기

프로그래밍 강의 메모/코딩으로 학습하는 GoF의 디자인 패턴_백기선

행동 관련 디자인 패턴 > 전략 패턴(Strategy Pattern)

https://inf.run/6Shr

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

 

 

전략 패턴

  • 행동 관련 디자인 패턴.
  • 여러 알고리듬을 캡슐화하고 상호 교환 가능하게 만드는 패턴.
  • 컨텍스트에서 사용할 알고리듬을 클라이언트가 선택한다.

 

어떤 업무를 수행하는 방법이 여러가지일 때, 

그 여러 알고리듬을 개별적인 클래스로 캡슐화하고, 

캡슐화되어 있는 것을 공통된 인터페이스로 추상화하여, 

로직을 수행하는 곳에서는 추상화된 인터페이스만 사용하여, 

코드는 바뀌지 않지만,

우리가 사용하는 알고리듬을 바꿔서 사용할 수 있게 만들어주는 패턴이다.







[클라이언트가 ConcreteStrategy를 의존하는 부분]

//클라이언트에서 사용할 ConcreteStrategy를 컨텍스트에 넣어준다.

//Context 메서드의 파라미터로 Strategy를 넘긴다.

game.blueLight(new Normal());



[Context가 Strategy 인터페이스를 의존하는 부분]

//Context에서 파라미터로 넘겨받은 Strategy를 바탕으로 로직 수행

//Strategy의 메서드를 호출한다.

public void blueLight(Speed speed) {

    speed.blueLight();

}



Context에서 상황에 따라 달라지는 로직들을 Strategy라는 인터페이스로 뽑아낸다.

그래서 Context가 Strategy를 참조하고 있다.

 

여기서 중요한 것은 인터페이스로 참조하고 있어야한다.

그래야 상호교환 가능한 여러가지 전략들을 바꿔서 사용할 수 있다.

 

ConcreteStrategy는 Strategy의 구현체로 각각의 알고리듬을 내부에서 구현한다.

 

클라이언트에서 사용할 ConcreteStrategy를 컨텍스트에 넣어줄 수 있다.

 

생성자에서 주입할 수도 있고 오퍼레이션을 실행할 때 파라미터로 넘겨줄 수 있다.

 

 

 

 

전략 패턴의 장점

1. 새로운 전략을 추가하더라도 기존 코드를 변경하지 않는다.

2. 상속 대신 위임을 사용할 수 있다.

상속은 하나만 가능하고 정말로 상속이 필요할 때 이미 상속을 받아 사용하지 못할 수 있다.

상속을 사용하면 상위 클래스가 변경 시 하위 클래스들이 모두 영향을 받는다.

3. 런타임에 전략을 변경할 수 있다.



전략 패턴의 단점

1. 복잡도가 증가한다.

2. 클라이언트 코드가 구체적인 전략을 알아야 한다.

 

 

 

 

 

https://refactoring.guru/ko/design-patterns/strategy

 

Strategy

The Strategy pattern lets you isolate the code, internal data, and dependencies of various algorithms from the rest of the code. Various clients get a simple interface to execute the algorithms and switch them at runtime. The Strategy pattern lets you do a

refactoring.guru

 

 

 

 

 

 

상태 패턴과 전략 패턴 차이점

https://stackoverflow.com/a/16058371

 

What is the difference between Strategy design pattern and State design pattern?

What are the differences between the Strategy design pattern and the State design pattern? I was going through quite a few articles on the web but could not make out the difference clearly. Can so...

stackoverflow.com

 

 

There can be a major difference, however, if ConcreteStates decide themselves the state transitions (see the "might determine" associations in the diagram above).



차이점은 다음과 같다.

State는, State에 따른 로직의 끝에, setState(new State())를 호출함으로써 

State를 스스로 변환할 수 있는데 반해,

 

Strategy의 경우 외부에서 데이터의 입력이 필요하다.



따라서 다음과 같이 정리할 수 있다.

 

Strategy Pattern : 행동(알고리즘)을 소유한 객체를 실행 시에 선택할 수 있게 하여 상황에 맞는 행동을 하게 하는데 유용

 -> 다양한 알고리즘이 짜증나는 경우 고려

 

State Pattern : 다양한 상태변화(전이)가 아주 복잡한 로직을 제어하는 데 유용

 -> if, else 문에 의한 분기점이 많아 복잡한 경우 고려