유연한 알고리즘 교체를 위한 디자인 패턴
실행 중에 알고리즘을 선택할 수 있게 하는 행위 디자인 패턴, 객체가 할 수 있는 행위들을 전략으로 만들어 놓고, 동적으로 행위를 자유롭게 바꿀 수 있게 해주는 패턴
코드 재사용성 향상
알고리즘의 캡슐화



🤔 날지 못하는 오리가 계속 추가되야하고, 모형오리처럼 날지도 못하고 소리도 못내는 오리들도 추가가 되야한다면?

이미지 출처 : 인파님 tistory - 전략패턴 완벽 마스터하기
Strategy (전략 인터페이스)
// 나는 행동 전략
public interface FlyBehavior {
void fly();
}
// 울음 소리 전략
public interface QuackBehavior {
void quack();
}
Concrete Strategies (구체적인 전략)
// 나는 행동 구현
public class FlyWithWings implements FlyBehavior {
public void fly() {
System.out.println("날개로 날아갑니다!");
}
}
public class FlyNoWay implements FlyBehavior {
public void fly() {
System.out.println("저는 날 수 없어요");
}
}
// 울음 소리 구현
public class Quack implements QuackBehavior {
public void quack() {
System.out.println("꽥꽥!");
}
}
public class Squeak implements QuackBehavior {
public void quack() {
System.out.println("삑삑!");
}
}
Context (컨텍스트)
public abstract class Duck {
protected FlyBehavior flyBehavior; // 전략 객체 참조
protected QuackBehavior quackBehavior; // 전략 객체 참조
public void performFly() {
flyBehavior.fly(); // 전략 위임
}
public void performQuack() {
quackBehavior.quack(); // 전략 위임
}
}
Client (클라이언트)
public class MallardDuck extends Duck {
public MallardDuck() {
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}
}
public class RubberDuck extends Duck {
public RubberDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Squeak();
}
}
호출
Duck mallard = new MallardDuck();
mallard.display();
mallard.performFly();
mallard.performQuack();
System.out.println();
Duck modelDuck = new ModelDuck();
modelDuck.display();
modelDuck.performQuack();
modelDuck.performFly();
modelDuck.setFlyBehavior(new FlyRocketPowered());
modelDuck.performFly();
System.out.println();
Reference