전략 패턴은
- 특정한 작업 또는 알고리즘을 독립적으로 정의하고
- 이를 캡슐화하여 교환 가능하게 만드는 패턴입니다.
오리 클래스를 설계한다고 해봅시다.
오리에게 날 수 있는 기능과 울음소리를 내는 기능을 구현하려면 어떻게 해야 할까요?
나는 행동, 우는 행동에 대한 인터페이스를 정의하고 오리 클래스가 인터페이스를 가지고 있으면 됩니다.
public interface FlyBehavior {
void fly();
}
public interface QuackBehavior {
void quack();
}
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
...
}
그리고 인터페이스에 대한 구현체 클래스를 정의해줍니다.
public class MuteQuack implements QuackBehavior{
public void quack() {
System.out.println("...");
}
}
public class FlyWithWings implements FlyBehavior{
public void fly() {
System.out.println("날고 있어요~");
}
}
오리 객체에서 우는 메서드, 나는 메서드를 수행하려면 어떻게 해야할까요?
인터페이스의 메서드를 실행하면 됩니다.
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
...
}
실제로 사용하는 예시로
날개를 이용해서 날고, 울지 못하는 오리 객체를 구현해볼까요?
public class muteDuckWithWings extends Duck{
public muteDuckWithWings() {
quackBehavior = new MuteQuack();
flyBehavior = new FlyWithWings();
}
}
flyBehavior의 구현체를 생성함에 따라 초능력으로 나는 행동, 로켓을 이용해 나는 행동 등을 정의하고, 재사용할 수 있습니다.
출처
에릭 프리먼, 엘리자베스 롭슨, 케이시 시에라, 버트 베이츠. 『헤드퍼스트 디자인패턴 개정판』. 한빛미디어, 2022
'Design Pattern' 카테고리의 다른 글
커맨드 패턴 (Command Pattern) (0) | 2023.09.27 |
---|---|
싱글턴 패턴(Singleton Pattern) (2) | 2023.09.25 |
팩토리 패턴(Factory Pattern) (0) | 2023.09.14 |
데코레이터 패턴(Decorator Pattern) (2) | 2023.09.11 |
옵저버 패턴(Observer Pattern) (0) | 2023.09.07 |