php设计模式-------(1)策略模式
2018-06-22 04:53:17来源:未知 阅读 ()
一、为什么我要学习设计模式。
我的上一个项目是做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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- PHP写UltraEdit插件脚本实现方法 2020-03-29
- php 带逗号千位符数字的处理方法 2020-03-28
- PHP三元运算符的结合性介绍 2020-03-28
- PHP静态延迟绑定和普通静态效率的对比 2020-03-28
- 基于php流程控制语句和循环控制语句 2020-03-28
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash