首页 > php教程 > php手册 > 正文

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

php中文网
发布: 2016-07-21 14:52:56
原创
1312人浏览过

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

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

二、策略模式

1.概念

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

立即学习PHP免费学习笔记(深入)”;

2.为什么会有策略模式

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

代码:

<span style="color: #008080;"> 1</span> <?<span style="color: #000000;">php
</span><span style="color: #008080;"> 2</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Duck {
</span><span style="color: #008080;"> 3</span>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> quack(){}
</span><span style="color: #008080;"> 4</span>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> swim(){}
</span><span style="color: #008080;"> 5</span>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> display(){}<br />       public function fly(){<br />           //会飞了<br />       }
</span><span style="color: #008080;"> 6</span>     <span style="color: #008000;">//</span><span style="color: #008000;">鸭子的其他方法  </span>
<span style="color: #008080;"> 7</span> <span style="color: #000000;">}
</span><span style="color: #008080;"> 8</span> 
<span style="color: #008080;"> 9</span> <span style="color: #0000ff;">class</span> MallarDuck <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Duck{
</span><span style="color: #008080;">10</span>      <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> display(){
</span><span style="color: #008080;">11</span>           <span style="color: #008000;">//</span><span style="color: #008000;">外观是绿头</span>
<span style="color: #008080;">12</span> <span style="color: #000000;">     }
</span><span style="color: #008080;">13</span> <span style="color: #000000;">}
</span><span style="color: #008080;">14</span> <span style="color: #0000ff;">class</span> RedDuck <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Duck{
</span><span style="color: #008080;">15</span>      <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> display(){
</span><span style="color: #008080;">16</span>           <span style="color: #008000;">//</span><span style="color: #008000;">外观是红头</span>
<span style="color: #008080;">17</span> <span style="color: #000000;">     }
</span><span style="color: #008080;">18</span> }
登录后复制

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

magento(麦进斗)
magento(麦进斗)

Magento是一套专业开源的PHP电子商务系统。Magento设计得非常灵活,具有模块化架构体系和丰富的功能。易于与第三方应用系统无缝集成。Magento开源网店系统的特点主要分以下几大类,网站管理促销和工具国际化支持SEO搜索引擎优化结账方式运输快递支付方式客户服务用户帐户目录管理目录浏览产品展示分析和报表Magento 1.6 主要包含以下新特性:•持久性购物 - 为不同的

magento(麦进斗) 0
查看详情 magento(麦进斗)

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

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

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

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

三、具体代码

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

</span><span style="color: #0000ff;">interface</span><span style="color: #000000;"> FlyBehavior {
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> fly();
}
</span><span style="color: #0000ff;">class</span> FlyWithWings <span style="color: #0000ff;">implements</span><span style="color: #000000;"> FlyBehavior{
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> fly(){
        </span><span style="color: #0000ff;">echo</span> '会飞'<span style="color: #000000;">;
    }
}
</span><span style="color: #0000ff;">class</span> FlyNoWay <span style="color: #0000ff;">implements</span><span style="color: #000000;"> FlyBehavior {
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> fly(){
        </span><span style="color: #0000ff;">echo</span> '不会飞'<span style="color: #000000;">;
    }
}

</span><span style="color: #0000ff;">interface</span><span style="color: #000000;"> QuackBehavior {
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> quack();
}
</span><span style="color: #0000ff;">class</span> Quackd <span style="color: #0000ff;">implements</span><span style="color: #000000;">  QuackBehavior {
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> quack(){
        </span><span style="color: #0000ff;">echo</span> '呱呱叫'<span style="color: #000000;">;
    }
}
</span><span style="color: #0000ff;">class</span> Squeak <span style="color: #0000ff;">implements</span><span style="color: #000000;">  QuackBehavior {
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> quack(){
        </span><span style="color: #0000ff;">echo</span> '吱吱叫'<span style="color: #000000;">;
    }
}
</span><span style="color: #0000ff;">class</span> MuteQuack <span style="color: #0000ff;">implements</span><span style="color: #000000;">  QuackBehavior {
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> quack(){
        </span><span style="color: #0000ff;">echo</span> '不会叫'<span style="color: #000000;">;
    }
}

</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
 * 模型鸭类
 </span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">class</span> ModelDuck <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Duck
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> __construct()
    {
        </span><span style="color: #800080;">$this</span>->flyBehavior = <span style="color: #0000ff;">new</span><span style="color: #000000;"> FlyNoWay();
        </span><span style="color: #800080;">$this</span>->quackBehavior = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Quackd();
    }

    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> display()
    {
        </span><span style="color: #0000ff;">echo</span> '模型鸭'<span style="color: #000000;">;
    }
}
</span><span style="color: #008000;">//</span><span style="color: #008000;">测试代码</span>
<span style="color: #800080;">$m</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> ModelDuck();
</span><span style="color: #800080;">$m</span>-><span style="color: #000000;">display();
</span><span style="color: #800080;">$m</span>-><span style="color: #000000;">performQuack();
</span><span style="color: #800080;">$m</span>-><span style="color: #000000;">performFly();
</span><span style="color: #800080;">$m</span>->setFlyBehavior(<span style="color: #0000ff;">new</span><span style="color: #000000;"> FlyWithWings());
</span><span style="color: #800080;">$m</span>->performFly();
登录后复制

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

 

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号