-
Notifications
You must be signed in to change notification settings - Fork 0
Strategy Pattern
객체들이 할 수 있는 행위(Method) 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화하는 인터페이스를 정의하여, 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법이다.
전략 패턴 UML 클래스
-
Strategy: 인터페이스나 추상 클래스로 외부에서 동일한 방식으로 메소드를 호출하는 방법을 명시 -
ConcreateStrategyA, B:Strategy에서 명시한 메소드를 실제로 구현한 클래스 -
Context:Strategy를 이용하는 역할. 필요에 따라 동적으로 구체적인 전략을 바꿀 수 있도록setter속성을 포함
초기 오리 시뮬레이션 UML 클래스
초기 디자인은 Duck 슈퍼 클래스를 만든 다음, 그 클래스를 확장하여 서로 다른 종류의 자식 클래스로 구성되어 있다.
이 다음, 오리를 날게하기 위해 fly() 메소드를 추가하는 과정에서 문제가 발생한다.
서브 클래스들 중 RobberDuck 클래스(고무 오리)는 날지 못하고, DecoyDuck 클래스(가짜 오리)는 날지도 못하고 꽥꽥거리기도 못한다.
- 상속으로 서브 클래스들에게 날게하는 기능을 추가하는 경우
슈퍼 클래스에 나는 기능을 추가한 UML 클래스
- 인터페이스로 기능을 분리한 다음 서브 클래스들에 추가하는 경우
인터페이스로 기능을 추가한 UML 클래스
위의 경우들로 문제를 해결하려 할 때 2가지 문제가 발생한다.
- 기존의 코드 내용을 수정하게 된다(OCP 법칙 위배).
- 서브 클래스 간에 코드가 중복된다.
각 행동은 인터페이스로 표현하고 이런 인터페이스를 사용해서 행동을 구현한다(IFlyBehavior, IQuackBehavior).
나는 행동과 꽥꽥거리는 행동은 Duck 클래스에서 구현하지 않는다.
인터페이스로 기능을 분리하고 행동을 구현한 UML 클래스
위의 방법으로 디자인하면 다른 형식의 객체에서도 나는 행동과 꽥꽥거리는 행동을 재사용할 수 있다. 그리고 기존의 행동 클래스를 수정하거나 날아다니는 행동을 사용하는 클래스를 전혀 건드리지 않고도 새로운 행동을 추가할 수 있다.
행동 클래스를 통합한 UML 클래스
Duck 클래스에 fly() 메소드와 quack() 메소드 대신 performFly() 메소드와 performQuack() 메소드를 사용해서 행동을 직접 처리하는 대신 인터페이스로 참조되는 객체에 그 행동을 위임한다.
✨ Author, Glory-Day