본문 바로가기
[CS] - Design Pattern

#4. 스트레티지 패턴 (Strategy Pattern)

by Bebsae 2021. 1. 19.

스트레티지 패턴은 행위를 클래스로 캡슐화하여 동적으로 바꿀 수 있게 해주는 패턴이다. 이번 포스트에서는 귀납적으로 코드를 살펴보겠다.

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("조용");
    }
}

위와 같이 행위를 캡슐화하여 상황에 따라 유연하고 전략적으로 특정 객체에 대한 행위를 바꿀 수 있다.

댓글