① 策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式。

② 实际应用举例,假如一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示不同的广告。

在 Common 目录下新建 UserStrategy.php,定义接口:

  1. <?php
  2. namespace Common;
  3.  
  4. //定义策略接口
  5. interface UserStrategy{
  6. //显示广告
  7. function showAd();
  8. //展示类目
  9. function showCategory();
  10. }

在 Common 目录下新建 FemaleUserStrategy.php ,女性用户的策略实现:

  1. <?php
  2. /*
  3. * 女性用户的策略实现
  4. */
  5. namespace Common;
  6. use Common\UserStrategy;
  7.  
  8. class FemaleUserStrategy implements UserStrategy{
  9.  
  10. function showAd(){
  11. echo '2015春夏新款女装';
  12. }
  13.  
  14. function showCategory(){
  15. echo '女装';
  16. }
  17. }

在 Common 目录下新建 MaleUserStrategy.php ,男性用户的策略实现:  

  1. <?php
  2. /*
  3. * 男性用户的策略实现
  4. */
  5. namespace Common;
  6. use Common\UserStrategy;
  7.  
  8. class MaleUserStrategy implements UserStrategy{
  9.  
  10. function showAd(){
  11. echo 'Apple Watch';
  12. }
  13.  
  14. function showCategory(){
  15. echo '电子产品';
  16. }
  17. }

入口文件 index.php:

  1. <?php
  2. define('BASEDIR',__DIR__); //定义根目录常量
  3. include BASEDIR.'/Common/Loader.php';
  4. spl_autoload_register('\\Common\\Loader::autoload');
  5.  
  6. class Page{
  7.  
  8. protected $strategy;
  9.  
  10. function index(){
  11. echo 'AD:';
  12. $this->strategy->showAd();
  13. echo '<br>Category:';
  14. $this->strategy->showCategory();
  15. }
  16.  
  17. //用于外部设置策略
  18. function setStrategy(\Common\UserStrategy $strategy){
  19. $this->strategy = $strategy;
  20. }
  21. }
  22.  
  23. $page = new Page();
  24. if(isset($_GET['female'])){
  25. $strategy = new \Common\FemaleUserStrategy();
  26. }else{
  27. $strategy = new \Common\MaleUserStrategy();
  28. }
  29. $page->setStrategy($strategy);
  30. $page->index();

访问 http://127.0.0.17/php/design/psr0/index.php?female

输出:

  1. AD:2015春夏新款女装
  2. Category:女装

访问 http://127.0.0.17/php/design/psr0/index.php

输出:

  1. AD:Apple Watch
  2. Category:电子产品

【策略模式的控制反转】

③ 使用策略模式可以实现 Ioc,依赖倒置、控制反转

在上例中 Page 类 依赖于 MaleUserStrategy 类和 FemaleUserStrategy 类。在 Page 类中不需要实现这两个类,在执行的过程中,才将这个关系进行绑定。

==

如果两个类是互相依赖的关系,那么它们之间就是一个紧耦合的设计,不利于替换其中某一个环节;而策略模式使用依赖倒置以后,就可以很方便地替换其中某一个类。

PHP 设计模式 笔记与总结(8)策略模式的更多相关文章

  1. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  2. 设计模式之第8章-策略模式(Java实现)

    设计模式之第8章-策略模式(Java实现) “年前大酬宾了啊,现在理发冲500送300,冲1000送500了.鱼哥赶紧充钱啊,理发这事基本一个月一回,挺实惠的啊.不过话说那个理发店的老板好傻啊,冲10 ...

  3. 《Head First 设计模式》读书笔记(1) - 策略模式

    <Head First 设计模式>(点击查看详情) 1.写在前面的话 之前在列书单的时候,看网友对于设计模式的推荐里说,设计模式的书类别都大同小异,于是自己就选择了Head First系列 ...

  4. 学C#之设计模式系列笔记(1)策略模式

    一.借鉴说明 1.<Head First Design Patterns>(中文名<深入浅出设计模式>) 2.维基百科,策略模式,https://zh.wikipedia.or ...

  5. javascript设计模式与开发实践阅读笔记(5)——策略模式

    策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 我的理解就是把各种方法封装成函数,同时存在一个可以调用这些方法的公共函数.这样做的好处是可以消化掉内部的分支判断,使代码效率 ...

  6. 【设计模式】行为型01策略模式(strategy patten)

    学设计模式一段时间了,有些懂了,有些半知半解,通过写笔记博客的方式总结一下: 关于策略模式,我的个人理解就是将一些经常变动的算法独立抽取出来,可以是一个方法,也可以是一个策略类,这样,如果有需求变更, ...

  7. 我所理解的设计模式(C++实现)——策略模式(Strategy Pattern)

    概述: 每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法. 而策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理.策 ...

  8. Python 中的设计模式详解之:策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中“不见了,或者简化了”. ...

  9. 设计模式总结篇系列:策略模式(Strategy)

    前面的博文中分别介绍了Java设计模式中的创建型模式和结构型模式.从本文开始,将分别介绍设计模式中的第三大类,行为型模式.首先我们了解下分为此三大类的依据. 创建型模式:主要侧重于对象的创建过程: 结 ...

  10. 《JavaScript设计模式与开发实践》-- 策略模式

    详情个人博客:https://shengchangwei.github.io/js-shejimoshi-celue/ 策略模式 1.定义 策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们 ...

随机推荐

  1. errno 错误码

    转自:http://baike.baidu.com/link?url=uX-q7K-TTL-5AFNT-hjhAP6fvgAwvsNkIMqJqJ3GEspYgtQXsovEEzpqmQ3ZmAgql ...

  2. 基于Lumisoft.NET组件的POP3邮件接收和删除操作(转载)

    Lumisoft.NET组件是一个非常强大的邮件发送.邮件接收等功能的开源组件,一般用它来处理邮件的相关操作,是非常合适的.之前也写过一些该组件的随笔文章,不过主要是利用来发送邮件居多,最近由于项目需 ...

  3. 使用awk排除第一行和第二行的数据

    因为linux shell命令行输出的前面几行一般是指导或是格式字段说明, 而不是实现的数据,所以在作过滤时,一般需要排除前面的几行. 现需要找出指定机器开放的所有端口. 我遇到的情况是要排除前面两行 ...

  4. 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))

    解决办法:在项目属性里设置“生成”=>“目标平台”为x86而不是默认的ANY CPU.

  5. js checkbox

    js checkbox <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...

  6. SQL Server 2008 数据库同步的两种方式 (发布、订阅)

    参考转载: SQL Server 2008 数据库同步的两种方式 (发布.订阅) 使用Sqlserver事务发布实现数据同步

  7. 神奇的HTML5离线存储(应用程序缓存)

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接前端小尚,谢谢! 前言 使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本. HTML5引入 ...

  8. Revit二次开发示例:Journaling

    关于Revit Journal读写的例子.   #region Namespaces using System; using System.Collections.Generic; using Sys ...

  9. The Accomodation of Students

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  10. python 代码片段11

    #coding=utf-8 #python里面的字典,用{}来表示 book={'title':'python web development','year':2008} print book pri ...