전략패턴은 실행 중에 알고리즘을 선택할 수 있게 하는 행위 소프트웨어 디자인 패턴이다. - 위키백과
전략 패턴 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 전략 패턴(strategy pattern) 또는 정책 패턴(policy pattern)은 실행 중에 알고리즘을 선택할 수 있게 하는 행위 소프트웨어 디자인 패턴이다. 전략 패턴은 특정한 계열
ko.wikipedia.org
코드
- Duck
public class Duck {
public FlyBehavior flyBehavior;
public QuackBehavior quackBehavior;
public void performQuack() {
this.quackBehavior.quack();
}
public void performFly() {
this.flyBehavior.fly();
}
public void changeFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void changeQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
오리가 "소리를 내는 행동"과 "나는 행동"의 구현이 분리되어 있고, change메서드를 통해 바꿀 수도 있다는 것을 알 수 있다.
즉 소리를 내는 알고리즘과 나는 알고리즘이 위임되어 있는 것이다.
날기 인터페이스를 만들고 구현체를 2개 만들었다.
- FlyBehavior
public interface FlyBehavior {
void fly();
}
- FlyRocketPowered
public class FlyRocketPowered implements FlyBehavior {
@Override
public void fly() {
System.out.println("로켓 추진으로 날아갑니다.");
}
}
- FlyWithWings
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("날개로 날아갑니다.");
}
}
소리를 내는 인터페이스와 구현체를 1개 만들었다.\
- QuackBehavior
public interface QuackBehavior {
void quack();
}
- KoreanQuack
public class KoreanQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("꽤괙");
}
}
Duck 클래스를 상속받은 NormalDuck을 만든다.
public class NormalDuck extends Duck {
public NormalDuck() {
this.quackBehavior = new KoreanQuack();
this.flyBehavior = new FlyWithWings();
}
}
이제 메인에서 실행시키면 아래와 같다.
public class Main {
public static void main(String[] args) {
Duck myDuck = new NormalDuck();
myDuck.performFly();
myDuck.performQuack();
System.out.println("=========================");
myDuck.changeFlyBehavior(new FlyRocketPowered());
myDuck.performFly();
myDuck.performQuack();
}
}
처음에는 날개로 날아갑니다와 꽤괙을 한다. changeFlyBehavior를 통해 날기를 로켓 추진으로 바꾼뒤에는 로켓 추진으로 날아갑니다가 출력된다.