php设计模式-------(1)策略模式

2018-06-22 04:53:17来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

一、为什么我要学习设计模式。

  我的上一个项目是做App接口,由于时间紧,老板催的急,所以到最后项目完工时发现居然写了几万行代码,可想而知代码质量有多糟糕。而且很多时候,调用接口的开发人员来找我说某个接口出错了,我回去调试一看才发现果然粗心写错一句代码,然而有六七个控制器里面我都有同样的语句,这就造成了我要回去查找那六七个文件,然后挨个修改。这下就傻眼,突然发现我真的应该看看设计模式了,这样可以提高代码质量,客户修改需求的时候也不至于让自己咬牙切齿(大家应该都有这种体会,哈哈);

二、策略模式

1.概念

策略模式:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。(概念太难理解)

2.为什么会有策略模式

  joe上班的公司做了一套模拟鸭子的游戏,游戏中会出现各种鸭子,有的会呱呱叫,有的会飞。

代码:

 1 <?php
 2 class Duck {
 3     public function quack(){}
 4     public function swim(){}
 5     public function display(){}
public function fly(){
//会飞了
}
6 //鸭子的其他方法 7 } 8 9 class MallarDuck extends Duck{ 10 public function display(){ 11 //外观是绿头 12 } 13 } 14 class RedDuck extends Duck{ 15 public function display(){ 16 //外观是红头 17 } 18 }

这样继承了Duck类的子类都可以实现飞行行为,但是如果玩具鸭就不能有飞行行为的话不是闹笑话了么?  有的人会说,我可以在子类里面重写父类的fly方法,这样就可以针对不同的具体子类给予不同的行为。但是这样的话,不是重复很多代码了吗?相信大家会直接copy,这样如果某一个地方出错,所有地方都要重新更改,而且老板随时改变需求,我们会被直接累趴。

所以设计模式里的原则来了:

    1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

    2.针对接口编程,而不是针对实现编程。

    3.多用组合,少用继承。

三、具体代码

<?php
abstract class Duck {
    public $flyBehavior;    //飞行行为
    public $quackBehavior;  //叫行为
    public function swim(){
        echo '鸭子会游泳';
    }
    public function performQuack(){
        $this->quackBehavior->quack();
    }
    public function performFly(){
        $this->flyBehavior->fly();
    }
    public function setFlyBehavior(FlyBehavior $fb){
        $this->flyBehavior = $fb;
    }
    public function setQuackBehavior(QuackBehavior $qb){
        $this->quackBehavior = $qb;
    }
    abstract function display();
}

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 Quackd implements  QuackBehavior {
    public function quack(){
        echo '呱呱叫';
    }
}
class Squeak implements  QuackBehavior {
    public function quack(){
        echo '吱吱叫';
    }
}
class MuteQuack implements  QuackBehavior {
    public function quack(){
        echo '不会叫';
    }
}

/**
 * 模型鸭类
 */
class ModelDuck extends Duck
{
    public function __construct()
    {
        $this->flyBehavior = new FlyNoWay();
        $this->quackBehavior = new Quackd();
    }

    public function display()
    {
        echo '模型鸭';
    }
}
//测试代码
$m = new ModelDuck();
$m->display();
$m->performQuack();
$m->performFly();
$m->setFlyBehavior(new FlyWithWings());
$m->performFly();

最后,设计模式是一种思想,不必生搬硬套,要不然只能适得其反。

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:win10本地搭建apache+php+mysql运行环境

下一篇:374&amp;375. Guess Number Higher or Lower 1&amp;2