• 技术文章 >php教程 >php手册

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

    2016-07-21 14:52:56原创529
    一、为什么我要学习设计模式。

      我的上一个项目是做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();

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

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php设计模式-------(1)策略模式
    上一篇:PHP JSON数组与对象的理解 下一篇:374&375. Guess Number Higher or Lower 1&2
    千万级数据并发解决方案

    相关文章推荐

    • PHP动态网页实现静态HTML技术的方法实现• 开发大型PHP项目的方法(一)• 简化的实现方法(限制为同一会话页面)• php中的网页重定向原创• 投票管理程序_php基础
    1/1

    PHP中文网