1. Strategy Pattern
객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여, 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법을 말합니다.
우선, 클래스에서 변화는 부분과 변하지 않는 부분을 분리해내야 합니다. 그 다음 아래처럼 변하는 부분(Flyable, Quackable)을 인터페이스로 분리해주면 됩니다.
분리된 인터페이스를 구현하는 객체 클래스를 만들어, 행동 유연하게 수정할 수 있습니다.
위 같은 구조를 짠 뒤에는, fly와 quack의 행동을 Duck 클래스 내에서 정의한 메소드를 써서 구현하지 않고 행동 클래스의 인스턴스를 생성해주면 됩니다. 그런 다음, 인스턴스를 상속받은 서브 클래스에서 각 특성에 맞춰 객체 클래스를 할당해줍니다. 아래 코드에서는 날개로 나는 특성과, 꽥꽥대는 특성을 설정해주었습니다.
flyable = new FlyWithWings();
quackable = new Quack();
이렇게 만들어준 특성을 변경할 수 있어야, 동적으로 만든 코드겠지요. 따라서, 행동 방식을 변경해 줄 수 있는 Setter 메소드를 Duck 클래스에 추가해줘야합니다. Setter 메소드의 역할은 외부 클래스에서 설정된 행동 특성을 변경하는 데 쓰일 것입니다.
public void setFlyBehavior(Flyable fb){
flyBehavior = fb;
}
public void setQuackBehavior(Quackable qb){
quackBehavior = qb;
}
이제 만든 코드를 테스트 해볼 수 있습니다. RealDuck에는 나는 특성과 꽥꽥거리는 특성을 설정해주었고, ModelDuck에는 날지 못하는 특성과 울지 않는 특성을 클래스 내에서 정의해주었습니다. 중간에 동적으로 행동을 지정해주기 위해 테스트 해보았습니다.
public class DuckSimulator {
public static void main(String[] args) {
Duck testDuck1 = new RealDuck();
Duck testDuck2 = new ModelDuck();
testDuck1.performFly();
testDuck2.performFly();
testDuck1.performQuack();
testDuck2.performQuack();
//testDuck1이 못나는 걸로 행동 특성과 울음소리 변경
testDuck1.setFlyBehavior(new FlyNoway());
testDuck1.setQuackBehavior(new Squack());
testDuck1.performFly();
testDuck1.performQuack();
}
}
게시글에는 전체 코드를 작성하진 않았는데, 전체 코드는 github로 공유하겠습니다. 이상으로 다음엔 옵저버 패턴에 대해 공부할 예정입니다.
'Design Pattern' 카테고리의 다른 글
[Design Pattern] 02. Observer Pattern (0) | 2020.07.16 |
---|