본문으로 바로가기

1. 정의

- 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다.

- 또한, 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.


2. 클래스다이어그램



참고 : UML 설명 (http://hongjinhyeon.tistory.com/25)



3. 디자인 원칙

- 애플리케이션에서 달라지는 부분을 찾아내고 달라지지 않는 부분으로 부터 분리시켜 캡슐화 한다. 

- 구현이 아닌 인터페이스에 맞쳐서 프로그래밍한다. 

- 상속보다 구성을 활용한다. ("A는 B이다" 보다 "A에는 B가 있다"가 나을 수 있다)

- 구성을 이용하여 시스템을 만들면 유연성을 크게 향상시킬 수 있다. 

- 알고리즘군을 별도의 클래스의 집합으로 캡슐화할 수 있도록 만들어 줄 뿐만 아니라, 실행시 행동을 바꿀있게 된다.


즉, 

- 메소드를 주구장창 만들어 행동을 구현할 수 있다. 

- 그러나 메소드로 구현하기 보다는 각 행동에 대해서 인터페이스(예 : Canfly, CanQuack)로 표현하고 인터페이스로 구현하는 편이 여러가지 유연성을 제공할 수 있게 된다. 

- 스트래티지 패턴에서 가장 중요한건 실행도중 행동을 바꿀 수 있다는 점

- 이런 장점때문에 경우에 따라서 상속보다 구성(중첩, 레어링)을 활용하는 것이다. 


ex. 오리 시뮬레이션

오리는 여러가지 행동을 취한다 가정(꽥꽥거리는 오리, 날라가는 오리, 헤엄치는 오리등)

또한 행동은 이후에 변경되거나 추가가 편리하도록 만들어야 한다.

interface CanFly { //날수있는 interface
    public function fly();
}

interface CanQuack { //소리낼수 있는 interface
    public function quack();
}

abstract class Duck implements CanFly, CanQuack {

  protected $color = "default"; //오리 색은 default로 선언

  public function fly(){
      echo "I'm flying with my {$this->color} wings\n";
  }

  public function quack(){
      echo "I'm quacking\n";
  }

  public function swim(){
      echo "I'm swimming\n";
  }
}

class DonaldDuck extends Duck {

    public function __construct(){
        $this->color = "white";
    }

    public function quack() { //quack을 가져와서 다른 소리를 내도록 수정
        echo "I can speack to english\n";
    }
}

$m = new DonaldDuck();
$m->fly();
$m->quack();
$m->swim();

출력하면 다음과 같다

I'm flying with my white wings
I can speack to english
I'm swimming


참고사이트 :

http://valley.egloos.com/viewer/?url=http://liepooh.egloos.com/1095062

http://stackoverflow.com/questions/5664572/php-duck-sample-head-first-design-patterns-chapter-one