본문 바로가기

Java/디자인패턴

전략패턴

반응형

헤드 퍼스트 디자인 패턴(개정판)을 공부하며 정리하는 내용입니다.

전략패턴

  • 디자인 원칙 중 첫번째 원칙은 "애플리케이션에서 변하는 부분을 찾고 변하지 않는 부분과 분리한다." 이다.
  • 변하는 부분을 찾아서 나머지 코드에 영향을 주지 않도록 캡슐화 하면 프로그램을 수정하거나 기능이 변경 될때도 기존의 코드를 건들이지 않고 변화에 유연하게 대처할 수 있다.
  • 객체 내부에서 인터페이스를 이용하여 틀을 만들고, 구현체에게 실제 동작하는 방식을 입력받아 유연하게 동작하도록 하는 방식을 전략 패턴이라고 한다.
  public abstract class Duck {

     FlyBehavior flyBehavior;
     Quackavior quackBehavior;


     public void fly(){
        flyBehavior.fly();
     }
     public void quack(){
        quackBehavior.quack();
     }
     public void swim(){
        System.out.println("오리는 모두 물에 뜬다.");
     }

     public void setFlyBehavior(FlyBehavior flyBehavior){
        this.flyBehavior = flyBehavior;
     }
     public void setQuackavior(Quackavior quackBehavior){
        this.quackBehavior = quackBehavior;
     }
  }



  public class MallardDuck extends Duck{

     public MallardDuck() {
        flyBehavior = new MallardDuckFly();
        quackBehavior = new MallardDuckQuack();
     }

     public void display(){
        System.out.println("청동오리");
     }
  }


  public class MallardDuckFly implements FlyBehavior{

     @Override
     public void fly() {
        System.out.println("MallardDUckFly");
     }
  }

Duck 클래스에서 fly와 quack는 Duck을 구현하는 오리의 종류에 따라 달라질 수 있다.

그렇기 때문에 그 부분을 인터페이스를 이용하여 틀을 만들어 두고

실제로 동작하는 방식은 MallardDuck 클래스에서 설정해 주어 원하는 동작을 전략에 따라서 선택하고, 유연하게 대응할 수 있도록 되어있다.

 

MallardDuck과 같이 생성자에서 인터페이스 구현체를 정의할 수도 있지만,

setter(ex setflyBehavior)를 이용하여 런타임시에 인터페이스 구현체를 바꿔 줄 수 있다.

 

반응형