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

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

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

<?php
namespace Common; //定义策略接口
interface UserStrategy{
//显示广告
function showAd();
//展示类目
function showCategory();
}

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

<?php
/*
* 女性用户的策略实现
*/
namespace Common;
use Common\UserStrategy; class FemaleUserStrategy implements UserStrategy{ function showAd(){
echo '2015春夏新款女装';
} function showCategory(){
echo '女装';
}
}

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

<?php
/*
* 男性用户的策略实现
*/
namespace Common;
use Common\UserStrategy; class MaleUserStrategy implements UserStrategy{ function showAd(){
echo 'Apple Watch';
} function showCategory(){
echo '电子产品';
}
}

入口文件 index.php:

<?php
define('BASEDIR',__DIR__); //定义根目录常量
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\\Common\\Loader::autoload'); class Page{ protected $strategy; function index(){
echo 'AD:';
$this->strategy->showAd();
echo '<br>Category:';
$this->strategy->showCategory();
} //用于外部设置策略
function setStrategy(\Common\UserStrategy $strategy){
$this->strategy = $strategy;
}
} $page = new Page();
if(isset($_GET['female'])){
$strategy = new \Common\FemaleUserStrategy();
}else{
$strategy = new \Common\MaleUserStrategy();
}
$page->setStrategy($strategy);
$page->index();

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

输出:

AD:2015春夏新款女装
Category:女装

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

输出:

AD:Apple Watch
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. tomcat The file is absent or does not have execute permission

    [root@centos02 bin]# ./startup.sh Cannot find ./catalina.sh The file is absent or does not have exec ...

  2. C++查询网站

    1.C++外文api查询 http://www.cplusplus.com/ 2.https://isocpp.org/ 3.Juce学习 http://www.thinksaas.cn/favori ...

  3. SVN服务器搭建和使用(二)(转载)

    转载地址:http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407979.html 上一篇介绍了VisualSVN Server和Torto ...

  4. Java Hour 55 Spring Framework 2

    上一章节估计被官方的说明文档扯晕了,其实说白了不就是个IOC 注入的容器么,用过了微软Enterprise Library 的Unity 的我还会怕这个.自己随便写个demo, 将知识的主题框架先构建 ...

  5. blend 从无到有系列之添加自定义Rectangle样式指定到资源文件

    相关链接 http://www.cnblogs.com/wildfeng/archive/2012/03/30/2425248.html http://www.cnblogs.com/jv9/arch ...

  6. wp7 BaseDictionary<TKey, TValue>

    /// <summary>/// Represents a dictionary mapping keys to values./// </summary>/// /// &l ...

  7. 表现层(jsp)、持久层(类似dao)、业务层(逻辑层、service层)、模型(javabean)、控制层(action)

    转自:http://www.blogjava.net/jiabao/archive/2007/04/08/109189.html 为了实现web层(struts)和持久层(Hibernate)之间的松 ...

  8. java错题本

    1.判断题: Java程序一般应当含有main方法,因为它是所有JaVa程序执行的入口(错) 解析:applet(java小程序)不用,application(java应用程序)需要.(见java a ...

  9. Java Serializable(序列化)

    1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object states,但 ...

  10. 电赛菜鸟营培训(三)——STM32F103CB之串口通信

    一.串口通信概念 1.缩写 USART:Universal Synchronous/Asynchronous Receiver/Transmitter 通用同步/异步接收和发送器 2.用处 (1)同步 ...