전략 패턴, 즉 전략 패턴은 알고리즘 계열을 정의하고 서로 교체할 수 있도록 별도로 캡슐화합니다. 이 패턴은 알고리즘을 사용하는 고객과 독립적으로 알고리즘 변경을 수행합니다.
오리를 사용하여 전략 패턴을 설명하겠습니다. 오리는 꽥꽥거리는 것과 나는 것의 두 가지 행동을 가지고 있습니다. 그러나 모든 오리가 꽥꽥거리고 날 수 있는 것은 아니므로 변화를 주는 이 두 가지 행동을 추출합니다.
<?php abstract class Duck{ public $flyBehavior; public $quackBehavior; public function __construct(){ } public function performFly(){ $this->flyBehavior->fly(); } public function performQuack(){ $this->quackBehavior->quack(); } public function setFlyBehavior(FlyBehavior $fb){ $this->flyBehavior = $fb; } public function setQuackBehavior(QuackBehavior $qb){ $this->quackBehavior = $qb; } public function swim(){ } abstract function display(); } interface FlyBehavior{ public function fly(); } class FlywithWings implements FlyBehavior{ public function fly(){ echo "i'm flying!\n"; } } class FlyNoWay implements FlyBehavior{ public function fly(){ echo "i can't fly.\n"; } } class FlyRocketPowered implements FlyBehavior{ public function fly(){ echo "i'm flying with a rocket!\n"; } } interface QuackBehavior{ public function quack(); } class Quack implements QuackBehavior{ public function quack(){ echo "quack!\n"; } } class MuteQuack implements QuackBehavior{ public function quack(){ echo "silence\n"; } } class MallardDuck extends Duck{ public function __construct(){ $this->quackBehavior = new Quack(); $this->flyBehavior = new FlyNoWay(); } public function display(){ echo "i'm a real mallar duck\n"; } } $duck = new MallardDuck; $duck->performFly(); $duck->setFlyBehavior(new FlyRocketPowered); $duck->performFly(); ?>
위의 코드를 보면 오리를 추상화한 것을 볼 수 있으며, 비행 동작과 꽥꽥거리는 운전은 인터페이스 형태로 되어 있으며, 위의 작성 방법을 사용하여 더 많은 조합을 사용하고 더 적은 상속을 사용한다는 것을 알 수 있습니다. 결합된 동작 객체가 올바른 인터페이스 표준을 충족하는 한, 알고리즘은 클래스로 캡슐화될 뿐만 아니라 "런타임에 동적으로 동작을 변경할" 수 있습니다.
위 내용은 Head First-Strategy 모델을 그 측면을 포함하여 소개한 내용으로, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.