您好,欢迎访问一九零五行业门户网

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

一、为什么我要学习设计模式。
我的上一个项目是做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.多用组合,少用继承。
三、具体代码
phpabstract 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();
最后,设计模式是一种思想,不必生搬硬套,要不然只能适得其反。
其它类似信息

推荐信息