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

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

二、策略模式

1.概念

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

2.为什么会有策略模式

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

代码:

 <?php
class Duck {
public function quack(){}
public function swim(){}
public function display(){}
public function fly(){
//会飞了
}
//鸭子的其他方法
} class MallarDuck extends Duck{
public function display(){
//外观是绿头
}
}
class RedDuck extends Duck{
public function display(){
//外观是红头
}
}

这样继承了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();

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

php设计模式-------(1)策略模式的更多相关文章

  1. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

  2. PHP设计模式之策略模式

    前提: 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查 找.排序等,一种常用的方法是硬编码(Hard Cod ...

  3. JavaScript设计模式之策略模式(学习笔记)

    在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选 ...

  4. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  5. JavaScript设计模式之策略模式

    所谓"条条道路通罗马",在现实中,为达到某种目的往往不是只有一种方法.比如挣钱养家:可以做点小生意,可以打分工,甚至还可以是偷.抢.赌等等各种手段.在程序语言设计中,也会遇到这种类 ...

  6. 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查

    原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...

  7. [design-patterns]设计模式之一策略模式

    设计模式 从今天开始开启设计模式专栏,我会系统的分析和总结每一个设计模式以及应用场景.那么首先,什么是设计模式呢,作为一个软件开发人员,程序人人都会写,但是写出一款逻辑清晰,扩展性强,可维护的程序就不 ...

  8. 设计模式入门,策略模式,c++代码实现

    // test01.cpp : Defines the entry point for the console application.////第一章,设计模式入门,策略模式#include &quo ...

  9. 设计模式之策略模式和状态模式(strategy pattern & state pattern)

    本文来讲解一下两个结构比较相似的行为设计模式:策略模式和状态模式.两者单独的理解和学习都是比较直观简单的,但是实际使用的时候却并不好实践,算是易学难用的设计模式吧.这也是把两者放在一起介绍的原因,经过 ...

  10. python设计模式之策略模式

    每次看到项目中存在大量的if else代码时,都会心生一丝不安全感. 特别是产品给的需求需要添加或者更改一种if条件时,生怕会因为自己的疏忽而使代码天崩地裂,哈哈,本文的目的就是来解决这种不安全感的, ...

随机推荐

  1. Yum本地Rpm库设置

    http://blog.csdn.net/dc_726/article/details/8497188   1 Yum对光盘的支持 查看/etc/yum.repos.d/CentOS-Media.re ...

  2. MyDetailedOS

    http://njumdl.sinaapp.com/ https://github.com/mudongliang

  3. DOS 命令 attrib:修改文件属性

    有时候系统中病毒之后会把自己的所有文件的属性改为隐藏只读格式,如果手动修改的话太麻烦并且浪费时间,不如用 Attrib 命令试试. 步骤: 1:开始->运行,在里面输入 cmd,打开命令行界面: ...

  4. php输出错误信息

    error_reporting(E_ALL);  ini_set('display_errors','on'); header("Content-Type:text/html;charset ...

  5. mysql事务问题

    mysql事务: 若mysql 开启事务后START TRANSACTION ,不显示提交commit,则默认自动回滚,而不是默认自动提交.

  6. C#_delegate - 值参数和引用参数

    值参数不能加,引用参数可以. 引用参数是共享的 using System; using System.Collections.Generic; using System.Linq; using Sys ...

  7. python <type 'exceptions.UnicodeDecodeError'>: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)解决

    import sysimport osimport stringreload(sys) sys.setdefaultencoding("utf8")

  8. FastDFS为什么要结合Nginx

    FastDFS为什么要结合Nginx? 我们在使用FastDFS部署一个分布式文件系统的时候,通过FastDFS的客户端API来进行文件的上传.下载.删除等操作.同时通过FastDFS的HTTP服务器 ...

  9. IE6 BUG margin 两倍

    触发条件: 父元素包含子元素 子元素设置了浮动(float) 子元素设置了外边距(margin) 浮动方向和边距方向一致 解决方案: 给该子元素添加 display:inline;

  10. 【C#4.0图解教程】笔记(第19章~第25章)

    第19章 泛型 1.泛型概念 泛型提供了一种更准确地使用有一种以上的类型的代码的方式. 泛型允许我们声明类型参数化的代码,我们可以用不同的类型进行实例化. 泛型不是类型,而是类型的模板.   2.声明 ...