스트레티지 패턴은 행위를 클래스로 캡슐화하여 동적으로 바꿀 수 있게 해주는 패턴이다. 이번 포스트에서는 귀납적으로 코드를 살펴보겠다.
public class DuckSimulator {
public static void main(String[] args) {
Duck mallard = new MarllardDuck();
mallard.performQuack(); // 꽥꽥
mallard.performFly(); // 난다!
// 캡슐화된 행위를 바꾸는 부분
mallard.setFlyBehavior(new FlyNoWay());
mallard.setQuackBehavior(new SQuack());
mallard.performQuack(); // 삑삑
mallard.performFly(); // 날지 못해용.
}
}
위 코드는 클라이언트에서 mallard의 행위를 전략적으로(Strategy)바꾼 것이다. 다음은 mallardDuck 클래스를 살펴보자.
public class MallardDuck extends Duck {
public MarllardDuck() {
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}
}
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
// setter - 짖는 행위 변경
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
// setter - 나는 행위 변경
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
// 짖는 행위 수행
public void performQuack() {
quackBehavior.quack();
}
// 나는 행위 수행
public void performFly() {
flyBehavior.fly();
}
}
MallardDuck은 나는 행위(FlyBehavior)를 FlywithWings, 짖는 행위(QuackBehavior)를 Quack으로 설정했다.
나는 행위(FlyBehavior)의 종류 : FlyWithWings, FlyNoWay
짖는 행위(QuackBehavior)의 종류 : Quack, SQuack, MuteQuack
이제 캡슐화된 행위를 볼 차례이다.
public interface FlyBehavior {
public void fly();
}
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("난다!");
}
}
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("날지 못해용.");
}
}
public interface QuackBehavior {
public void quack();
}
public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("꽥꽥");
}
}
public class SQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("삑삑");
}
}
public class MuteQuck implements QuackBehavior {
@Override
public void quack() {
System.out.println("조용");
}
}
위와 같이 행위를 캡슐화하여 상황에 따라 유연하고 전략적으로 특정 객체에 대한 행위를 바꿀 수 있다.
'[CS] - Design Pattern' 카테고리의 다른 글
# 5. 싱글턴 패턴 응용 (0) | 2021.08.04 |
---|---|
#3. 컴포지트 패턴 (Composite Pattern) (0) | 2021.01.19 |
#2. 데코레이터 패턴 (Decorator Pattern) (0) | 2020.12.28 |
#1. 싱글턴 패턴 (Singletone Pattern) (0) | 2020.12.10 |
#0. GoF 디자인 패턴 (2) | 2020.12.07 |
댓글