스트래티지 패턴(Strategy Pattern) : 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 이용할 수 있도록 만든다. 스트래티지를 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.
Duck 클래스
public abstract class Duck {
QuackBehavior quackBehavior;
FlyBehavior flyBehavior;
public abstract void display();
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
public void swim() {
System.out.println("모든 오리는 물에 뜹니다. 가짜 오리도 뜨죠");
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
}Duck의 소리를 내는 행동과 나는 행동을 Duck 클래스 내에서 직접 구현하지 않고 다른 클래스에 위임한다는 점이 중요!
소리를 내는 행동에 대한 인터페이스 및 클래스 정의
public interface QuackBehavior {
public void quack();
}public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("꽥");
}
}public class MuteQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("<< 조용~ >>");
}
}public class Squeak implements QuackBehavior {
@Override
public void quack() {
System.out.println("삑");
}
}나는 행동에 대한 인터페이스 및 클래스 정의
public interface FlyBehavior {
public void fly();
}public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("저는 못 날아요");
}
}public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("날고 있어요!!");
}
}public class FlyRocketPowered implements FlyBehavior {
@Override
public void fly() {
System.out.println("로켓 추진으로 날아갑니다");
}
}public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
@Override
public void display() {
System.out.println("저는 물오리입니다");
}
}public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
@Override
public void display() {
System.out.println("저는 모형 오리입니다");
}
}public class MiniDuckSimulator {
public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly();
Duck model = new ModelDuck();
model.performFly();
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}실행 결과
꽥
날고 있어요!!
저는 못 날아요
로켓 추진으로 날아갑니다HEAD FIRST DESIGN PATTERNS
해당 책을 읽고 정리를 위한 메모입니다. 저작권 문제 시 삭제하겠습니다.
'dev > 기타' 카테고리의 다른 글
| M1 Macbook 윈도우 설치(UTM) (0) | 2022.04.11 |
|---|---|
| JUnit 5 (0) | 2020.11.22 |
| CKEditor Re Initialising (0) | 2020.04.30 |
| RabbitMQ - Windows 설치 (0) | 2020.04.13 |
| 티스토리 스킨 - Scroll Indicator 추가하기 (0) | 2020.03.24 |