策略模式:
  策略模式(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. linux下常用命令之nc
  2. 关于SQL操作的一些经验
  3. Python中zip()函数的解释和可视化
  4. 5.关于QT中的网络编程,QTcpSocket,QUdpSocket
  5. 模板类的定义和实现可以分开吗?
  6. 向量化计算cell_吴恩达老师课程笔记系列第24节-Octave教程之向量化和作业(6)
  7. power bi 创建空表_如何使用R在Power BI中创建地理地图
  8. zabbix监控TCP连接数
  9. nyoj------20吝啬的国度
  10. mt4代理服务器存放文件,MT4指标EA DLL等文件放置目录
  11. 计算机键盘上的每一个按键应用,电脑键盘按键都代表着什么意思?
  12. 计数显示器c语言程序,单片机计数显示器.doc
  13. java导出excel设置行高列宽_Java 设置Excel自适应行高或列宽
  14. 鱼塘钓鱼(fishing)
  15. 信息安全与密码学概论
  16. 室内定位导航-室内地图导航-高精度地图应用场景
  17. vPlayer 模块Demo
  18. 新混响预设合集 – Audio Ease Altiverb 7 New Impulse Responses
  19. element-ui快速使用(使用element-ui做一个表格)
  20. 【进阶C语言】五人赛跑的真实排名

热门文章

  1. poj 1781 In Danger
  2. 关于 Hive 报 SemanticException 错误的问题
  3. tensorboard scalar图下载失败不完整解决
  4. v-if 和 v-else-if 和v-else的使用
  5. springcloud 与springboot的依赖关系以及版本的选择
  6. 快速上手RaphaelJS--RaphaelJS_Starter翻译(二)
  7. Matlab处理JSON数据
  8. 国产化达梦数据库数据迁移文档:oracle11g数据库转达梦8数据库实例演示
  9. Java 技术篇-利用exe4j工具生成exe文件实例演示,IntelliJ IDEA将项目转化为jar包方法,运行生成后的程序弹出exe4j提示处理,生成的程序显示控制台设置方法
  10. IMXRT 分散加载文件 修改OCRAM,DTCM、ITCM大小