전략패턴은 실행 중에 알고리즘을 선택할 수 있게 하는 행위 소프트웨어 디자인 패턴이다. - 위키백과

 

전략 패턴 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 전략 패턴(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를 통해 날기를 로켓 추진으로 바꾼뒤에는 로켓 추진으로 날아갑니다가 출력된다.

+ Recent posts