学习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 相关文章推荐
提问的智慧(2)
Oct 09 PHP
php中数据的批量导入(csv文件)
Oct 09 PHP
php cookie的操作实现代码(登录)
Dec 29 PHP
php截取字符串并保留完整xml标签的函数代码
Feb 06 PHP
php获取textarea的值并处理回车换行的方法
Oct 20 PHP
浅谈php的优缺点
Jul 14 PHP
图文介绍PHP添加Redis模块及连接
Jul 28 PHP
PHP正则表达式过滤html标签属性(DEMO)
May 04 PHP
PHP中使用foreach()遍历二维数组的简单实例
Jun 13 PHP
Yii2实现多域名跨域同步登录退出
Feb 04 PHP
Laravel框架实现利用监听器进行sql语句记录功能
Jun 06 PHP
PHP+redis实现的悲观锁机制示例
Jun 12 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
php skymvc 一款轻量、简单的php
2011/06/28 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
PHP中如何防止外部恶意提交调用ajax接口
2016/04/11 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
2019/10/30 PHP
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
jQuery动态星级评分效果实现方法
2015/08/06 Javascript
javascript实现自动填写表单实例简析
2015/12/02 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
react 父子组件之间通讯props
2018/09/08 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
2020/03/02 Javascript
[02:52]DOTA2新手基础教程 米波
2014/01/21 DOTA
Python中的深拷贝和浅拷贝详解
2015/06/03 Python
python实现随机森林random forest的原理及方法
2017/12/21 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
2018/12/05 Python
详解Django-restframework 之频率源码分析
2019/02/27 Python
python制作抖音代码舞
2019/04/07 Python
TensorFlow tf.nn.max_pool实现池化操作方式
2020/01/04 Python
Python3.7实现验证码登录方式代码实例
2020/02/14 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
意大利火车票和铁路通行证专家:ItaliaRail
2019/01/22 全球购物
SAZAC的动物连体衣和动物睡衣:Kigurumi Shop
2020/03/14 全球购物
澳大利亚著名的纺织品品牌:Canningvale
2020/05/05 全球购物
事业单位请假制度
2014/01/13 职场文书
粗加工管理制度
2014/02/04 职场文书
部队党性分析材料
2014/02/16 职场文书
个人催款函范文
2015/06/23 职场文书
我的中国梦主题班会
2015/08/14 职场文书
会议承办单位欢迎词
2015/09/30 职场文书
高一英语教学反思
2016/03/03 职场文书
你有一份《诚信考试承诺书》待领取
2019/11/13 职场文书
星际争霸:毕姥爷vs解冻03
2022/04/01 星际争霸
详解Python中的for循环
2022/04/30 Python