PHP设计模式-策略模式

定义 策略模式 定义了算法族,并分别封装起来,让它们之间可以相互替换,让算法的变化独立于使用算法的客户
优点

  • 策略模式提供了管理相关的算法族的办法
  • 策略模式提供了可以替换继承关系的办法 将算封闭在独立的策略类中使得你可以独立于其客户改变它
  • 使用策略模式可以避免使用多重条件转移语句。
缺点
  • 客户必须了解所有的策略 这是策略模式一个潜在的缺点
  • 算法族和客户之间的通信开销
  • 策略模式会造成很多的策略类
鸭子类图 PHP设计模式-策略模式
文章图片
>; FlyBehavior; fly()%5D%5E-.-%5BFlyWithWings%7Cfly()%5D,%5B<>; FlyBehavior; fly()%5D%5E-.-%5BNoFly%7Cfly()%5D,%5B<>; QuackBehavior; quack()%5D%5E-.-%5BQuack%7Cquack()%5D,%5B<>; QuackBehavior; quack()%5D%5E-.-%5BSqueak%7Cquack()%5D,%5B<>; Duck%5D++->%5B<>; FlyBehavior; fly()%5D,%5B<>; Duck%5D++->%5B<>; QuackBehavior; quack()%5D,%5B<>; Duck%5D%5E-%5BMallardDuck%5D,%5B<>; Duck%5D%5E-%5BRubber%5D"> 鸭子实例 飞行
//飞行接口 interface FlyBehavior { public function fly(); }//会飞 class FlyWithWings implements FlyBehavior { public function fly() { echo "用翅膀飞"; } }//不会飞 class FlyNoWay implements FlyBehavior { public function fly() { echo "我不会飞"; } }


//叫接口 interface QuackBehavior { public function quack(); }//呱呱叫 class Quack implements QuackBehavior { public function quack() { echo "呱呱叫"; } }//吱吱叫 class Squeak implements QuackBehavior { public function quack() { echo "吱吱叫"; } }

鸭子类
abstract class Duck { private flyBehavior; private quackBehavior; public abstract function display(); public function setFlyBehavior(FlyBehavior $flyBehavior) { $this->flyBehavior = $flyBehavior; }public function setQuackBehavior(QuackBehavior $quackBehavior) { $this->quackBehavior = $quackBehavior; }public function performFly() { $this->flyBehavior->fly(); }public functioin performQuack() { $this->quackBehavior->quack(); } }class MallardDuck extends Duck { public function display() { echo "我是一只Mallard鸭子"; } }

【PHP设计模式-策略模式】测试
$fly = new FlyWithWings(); $quack = new Quack(); $mallardDuck = new MallardDuck(); $mallardDuck->setFlyBehavior($fly); $mallardDuck->setQuackBehavior($quack); $mallardDuck->performFly(); $mallardDuck->performQuack();

    推荐阅读