学习php设计模式 php实现策略模式(strategy)


Posted in PHP onDecember 07, 2015

一、意图
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。策略模式可以使算法可独立于使用它的客户而变化
策略模式变化的是算法
二、策略模式结构图

学习php设计模式 php实现策略模式(strategy) 

三、策略模式中主要角色
抽象策略(Strategy)角色:定义所有支持的算法的公共接口。通常是以一个接口或抽象来实现。Context使用这个接口来调用其ConcreteStrategy定义的算法
具体策略(ConcreteStrategy)角色:以Strategy接口实现某具体算法
环境(Context)角色:持有一个Strategy类的引用,用一个ConcreteStrategy对象来配置
四、策略模式的优点和缺点
策略模式的优点:
1、策略模式提供了管理相关的算法族的办法
2、策略模式提供了可以替换继承关系的办法 将算封闭在独立的Strategy类中使得你可以独立于其Context改变它
3、使用策略模式可以避免使用多重条件转移语句。
策略模式的缺点:
1、客户必须了解所有的策略 这是策略模式一个潜在的缺点
2、Strategy和Context之间的通信开销
3、策略模式会造成很多的策略类
五、策略模式适用场景
1、许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法
2、需要使用一个算法的不同变体。
3、算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的,与算法相关的数据结构
4、一个类定义了多种行为,并且 这些行为在这个类的操作中以多个形式出现。将相关的条件分支移和它们各自的Strategy类中以代替这些条件语句
六、策略模式与其它模式
Template模式:模板方法模式与策略模式的不同在于,策略模式使用委派的方法提供不同的算法行为,而模板方法使用继承的方法提供不同的算法行为
享元模式(flyweight模式):如果有多个客户端对象需要调用 同样的一睦策略类的话,就可以使它们实现享元模式
七、策略模式PHP示例

<?php
/**
 * 抽象策略角色,以接口实现
 */
interface Strategy {
 
  /**
   * 算法接口
   */
  public function algorithmInterface();
}
 
/**
 * 具体策略角色A
 */
class ConcreteStrategyA implements Strategy {
 
  public function algorithmInterface() {
    echo 'algorithmInterface A<br />';
  }
}
 
/**
 * 具体策略角色B
 */
class ConcreteStrategyB implements Strategy {
 
  public function algorithmInterface() {
    echo 'algorithmInterface B<br />';
  }
}
 
/**
 * 具体策略角色C
 */
class ConcreteStrategyC implements Strategy {
 
  public function algorithmInterface() {
    echo 'algorithmInterface C<br />';
  }
}
 
/**
 * 环境角色
 */
class Context {
  /* 引用的策略 */
  private $_strategy;
 
  public function __construct(Strategy $strategy) {
    $this->_strategy = $strategy;
  }
 
  public function contextInterface() {
    $this->_strategy->algorithmInterface();
  }
 
}
 
/**
 * 客户端
 */
class Client {
 
  /**
   * Main program.
   */
  public static function main() {
    $strategyA = new ConcreteStrategyA();
    $context = new Context($strategyA);
    $context->contextInterface();
 
    $strategyB = new ConcreteStrategyB();
    $context = new Context($strategyB);
    $context->contextInterface();
 
    $strategyC = new ConcreteStrategyC();
    $context = new Context($strategyC);
    $context->contextInterface();
  }
 
}
 
Client::main();
?>

以上就是使用php实现策略模式的代码,还有一些关于策略模式的概念区分,希望对大家的学习有所帮助。

PHP 相关文章推荐
ip签名探针
Oct 09 PHP
PHP中动态显示签名和ip原理
Mar 28 PHP
使用PHP实现密保卡功能实现代码&amp;lt;打包下载直接运行&amp;gt;
Oct 09 PHP
php 文本文件的读取效率
Feb 10 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
May 06 PHP
在PHP语言中使用JSON和将json还原成数组的方法
Jul 19 PHP
thinkPHP实现签到功能的方法
Mar 15 PHP
PHP实现限制IP访问的方法
Apr 20 PHP
php从数据库中读取特定的行(实例)
Jun 02 PHP
Laravel使用RabbitMQ的方法示例
Jun 18 PHP
Yii框架响应组件用法实例分析
Sep 04 PHP
PHP设计模式(观察者模式)
Jul 07 PHP
学习php设计模式 php实现状态模式
Dec 07 #PHP
学习php设计模式 php实现适配器模式
Dec 07 #PHP
分享五个PHP7性能优化提升技巧
Dec 07 #PHP
学习php设计模式 php实现工厂模式(factory)
Dec 07 #PHP
学习php设计模式 php实现原型模式(prototype)
Dec 07 #PHP
PHP中Enum(枚举)用法实例详解
Dec 07 #PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
Dec 07 #PHP
You might like
一个程序下载的管理程序(二)
2006/10/09 PHP
一个简单实现多条件查询的例子
2006/10/09 PHP
PHP XML和数组互相转换详解
2016/10/26 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
浅析PHP7的多进程及实例源码
2019/04/14 PHP
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
2007/08/13 Javascript
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
2012/08/14 Javascript
老生常谈angularjs中的$state.go
2017/04/24 Javascript
Angular 4依赖注入学习教程之Injectable装饰器(六)
2017/06/04 Javascript
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
elementUI Vue 单个按钮显示和隐藏的变换功能(两种方法)
2018/09/04 Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
2018/10/31 Javascript
如何用JavaScript实现功能齐全的单链表详解
2019/02/11 Javascript
Vue infinite update loop的问题解决
2019/04/23 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
javascript事件监听与事件委托实例详解
2019/08/16 Javascript
layui 地区三级联动 form select 渲染的实例
2019/09/27 Javascript
JavaScript代码异常监控实现过程详解
2020/02/17 Javascript
[57:24]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python使用SQLite和Excel操作进行数据分析
2018/01/20 Python
Python爬虫实现简单的爬取有道翻译功能示例
2018/07/13 Python
python使用xlrd模块读取xlsx文件中的ip方法
2019/01/11 Python
python中rc1什么意思
2020/06/19 Python
Python正则re模块使用步骤及原理解析
2020/08/18 Python
Python控制鼠标键盘代码实例
2020/12/08 Python
python sleep和wait对比总结
2021/02/03 Python
CSS3 flex布局之快速实现BorderLayout布局
2015/12/03 HTML / CSS
Tarte Cosmetics官网:美国最受欢迎的化妆品公司之一
2017/08/24 全球购物
英国领先的在线鱼贩:The Fish Society
2020/08/12 全球购物
Java面试中常遇到的问题,也是需要注意的几点
2013/08/30 面试题
护士工作失误检讨书
2014/09/14 职场文书
悬空寺导游词
2015/02/05 职场文书
护理专业自我评价
2015/03/11 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书