策略模式:
  策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。
  策略模式是一种对象行为型模式。

模式动机:
  完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。
  在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加新的解决途径。
  在软件系统中,有许多算法可以实现某一功能,如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…等条件判断语句来进行选择。这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。

角色分析:
  抽象策略角色:策略类,通常由一个接口或者抽象类实现。
  具体策略角色:包装了相关的算法和行为。
  环境角色:持有一个策略类的引用,最终给客户端调用。

UML类图:

  

代码实现:

  

<?php
header("Content-type:text/html;Charset=utf-8");
//抽象策略接口
abstract class Strategy{abstract function wayToSchool();
}
//具体策略角色
class BikeStrategy extends Strategy{function wayToSchool(){echo "骑自行车去上学";}
}
class BusStrategy extends Strategy{function wayToSchool(){echo "乘公共汽车去上学";}
}
class TaxiStrategy extends Strategy{function wayToSchool(){echo "骑出租车去上学";}
}//环境角色
class Context{private $strategy;//获取具体策略function getStrategy($strategyName){try{$strategyReflection = new ReflectionClass($strategyName);$this->strategy = $strategyReflection->newInstance();}catch(ReflectionException $e){$this->strategy = ""; }       }function goToSchool(){$this->strategy->wayToSchool();// var_dump($this->strategy);
    }
}//测试
$context = new Context();
$context->getStrategy("BusStrategy");
$context->goToSchool();?>

优点:
  1、 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。
  2、 策略模式提供了可以替换继承关系的办法,继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。
  3、 使用策略模式可以避免使用多重条件转移语句。
多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。

缺点:
  1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
  2、 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。
有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。

转载于:https://www.cnblogs.com/yujon/p/5538464.html

策略模式和php实现相关推荐

  1. 【Design pattern】简单工厂过渡策略模式

    把自己当做小菜来跟学<大话设计模式>,跟着故事的思路来走 简单工厂模式:实现一个计算器代码 策略模式:商场打折代码 根据大鸟和小菜的故事,一步步的完善问题的过程!

  2. 设计模式 之美 -- 策略模式

    策略模式作为行为型设计模式中的一种,主要封装相同功能的不同实现算法,用于在用户程序内部灵活切换.对用户来说能够快速替换对应的算法,能够让算法的实现独立于使用的用户. 基本的UML类图如下: 用户使用S ...

  3. 设计模式之策略模式(Strategy)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  4. Java中的策略模式实例教程

    策略模式是一种行为模式.用于某一个具体的项目有多个可供选择的算法策略,客户端在其运行时根据不同需求决定使用某一具体算法策略. 策略模式也被称作政策模式.实现过程为,首先定义不同的算法策略,然后客户端把 ...

  5. else 策略模式去掉if_设计模式(三)——简单的状态模式代替if-else

    博主将会针对Java面试题写一组文章,包括J2ee,SQL,主流Web框架,中间件等面试过程中面试官经常问的问题,欢迎大家关注.一起学习,一起成长. 前言 大多数开发人员现在还在使用if else的过 ...

  6. C++模式学习------策略模式

    当遇到同一个对象有不同的行为,方法,为管理这些方法可使用策略模式. 策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来.通常把一个系列的算法包装到一系列的策略类里面,这些类继承一个抽象的 ...

  7. 模板方法模式与策略模式的区别

    2019独角兽企业重金招聘Python工程师标准>>> 模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义 ...

  8. 【设计模式】 模式PK:策略模式VS状态模式

    1.概述 行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下. 策略模式(左)和状态模式(右)的通用类图. 两个类图非常相似,都是通过Cont ...

  9. 如何使用 Spring 实现策略模式+工厂模式

    欢迎关注方志朋的博客,回复"666"获面试宝典 一.策略模式 策略模式定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换 1.策略模式主要角色 主要角色如下: 封装角色( ...

  10. 一个支付案例,学会策略模式!

    点击关注公众号,Java干货及时送达 作者 | 叁滴水 来源 | https://blog.csdn.net/qq_30285985/ 前言 在开发时,总会遇到支付的需求,但是支付的方式有很多,支付宝 ...

最新文章

  1. 移动端滚动穿透问题完美解决方案
  2. webpack 打包编译优化之路
  3. Ajax里的onreadystatechange的作用
  4. Java技术中的三大特性
  5. vue 单独页面定时器 离开页面销毁定时器
  6. 【编程练习】八大排序算法
  7. 在sqlyog中创建MySQL触发器简单实例
  8. java 手势识别_【人体分析-手势识别】-Java示例代码
  9. FLASH和EEPROM的最大区别
  10. 家用计算机常见故障及解决方式,电脑常见故障及处理方法汇总
  11. 怎么压缩html的文件,css如何压缩?
  12. 数据表多次更新插入重复数据去重SQL
  13. 软件项目确立的几个步骤
  14. x86 单线并发多拨_【转帖】适用所有CC版的 openwrt 单线并发多拨教程!!!
  15. 计算机在未来医学中的应用,【-通信传播论文:计算机技术在医学中的应用材料】...
  16. 计算机硬件技术基础 徐林,水平定向钻机虚拟现实实训系统硬件研发.ppt
  17. 嵌入式:ARM间接寻址、变址寻址与多寄存器寻址
  18. 九度-1008 最短路径
  19. 2022年乡村医生考试复习题及答案
  20. META-INF/MANIFEST.MF介绍 _

热门文章

  1. JSP读取My SQL数据乱码问题的解决
  2. centos6.3下搭建LAMP环境
  3. 图文方式管理Linux服务器(Webmin)
  4. (转载)为什么Linux不需要碎片整理?
  5. MySQL无法存储中文问题
  6. Manage Service Appointments
  7. JDK源码解析 —— IO流中的包装类使用到了装饰者模式
  8. bugku 闪得好快
  9. C#把TextBox.Text的几万条数据按数据格式导出Excel报错:Insufficient memory to continue the execution of the program.
  10. 单片机模块学习之键盘