PHP 设计模式 笔记与总结(8)策略模式
① 策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式。
② 实际应用举例,假如一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示不同的广告。
在 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)策略模式的更多相关文章
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
- 设计模式之第8章-策略模式(Java实现)
设计模式之第8章-策略模式(Java实现) “年前大酬宾了啊,现在理发冲500送300,冲1000送500了.鱼哥赶紧充钱啊,理发这事基本一个月一回,挺实惠的啊.不过话说那个理发店的老板好傻啊,冲10 ...
- 《Head First 设计模式》读书笔记(1) - 策略模式
<Head First 设计模式>(点击查看详情) 1.写在前面的话 之前在列书单的时候,看网友对于设计模式的推荐里说,设计模式的书类别都大同小异,于是自己就选择了Head First系列 ...
- 学C#之设计模式系列笔记(1)策略模式
一.借鉴说明 1.<Head First Design Patterns>(中文名<深入浅出设计模式>) 2.维基百科,策略模式,https://zh.wikipedia.or ...
- javascript设计模式与开发实践阅读笔记(5)——策略模式
策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 我的理解就是把各种方法封装成函数,同时存在一个可以调用这些方法的公共函数.这样做的好处是可以消化掉内部的分支判断,使代码效率 ...
- 【设计模式】行为型01策略模式(strategy patten)
学设计模式一段时间了,有些懂了,有些半知半解,通过写笔记博客的方式总结一下: 关于策略模式,我的个人理解就是将一些经常变动的算法独立抽取出来,可以是一个方法,也可以是一个策略类,这样,如果有需求变更, ...
- 我所理解的设计模式(C++实现)——策略模式(Strategy Pattern)
概述: 每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法. 而策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理.策 ...
- Python 中的设计模式详解之:策略模式
虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中“不见了,或者简化了”. ...
- 设计模式总结篇系列:策略模式(Strategy)
前面的博文中分别介绍了Java设计模式中的创建型模式和结构型模式.从本文开始,将分别介绍设计模式中的第三大类,行为型模式.首先我们了解下分为此三大类的依据. 创建型模式:主要侧重于对象的创建过程: 结 ...
- 《JavaScript设计模式与开发实践》-- 策略模式
详情个人博客:https://shengchangwei.github.io/js-shejimoshi-celue/ 策略模式 1.定义 策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们 ...
随机推荐
- 使用HttpClient操作ASP.NET Web API 2.1增删改查
使用NuGet包安装Microsoft ASP.NET Web API 2.1 Client Libraries, 调用方式代码如下: HttpClient client = new HttpClie ...
- javascript集合的交,并,补,子集的操作实现
可能新的ECMA规范里已有了这些的实现, 但能自己从头开始实现,感觉也非常不错的哟... function Set() { var items = {}; this.has = function(va ...
- Start GitHub
google 的各种被墙大家都懂的,所以转向GitHub 的怀抱. 以前其实也关注过,这回是下决心好好试用了. Fork repositories Forking creates a new, uni ...
- 开源的DevOps开发工具箱
DevOps是一组过程.方法与系统的统称,用于促进开发(应用程序/软件工程).技术运营和质量保障(QA)部门之间的沟通.协作与整合.在DevOps的整个流程中,使用一些开源工具可以促进开发与运维之间的 ...
- 理解ASP.NET 5的中间件
今天推荐的这篇文章,讲述了如何实现和使用ASP.NET 5的中间件. 虽然在ASP.NET 5中,微软没有再强调OWIN(Open Web Interface for .NET)及其微软官方的OWIN ...
- java_final关键字的使用
final : 最终.作为一个修饰符,1,可以修饰类,函数,变量.2,被final修饰的类不可以被继承.为了避免被继承,被子类复写功能.3,被final修饰的方法不可以被复写.4,被final修饰的变 ...
- Hark的数据结构与算法练习之快速排序
前言 快速排序是最常见,也是面试中最容易考的排序方法,这里做一下总结 算法说明 其实这里说的很清楚了:http://blog.csdn.net/morewindows/article/details/ ...
- 登录Cloudera Manager时报错org.hibernate.exception.GenericJDBCException: Could not open connection
去Cloudera Server上边看了一下日志: cat /opt/cloudera-manager/log/cloudera-scm-server/cloudera-scm-server.log ...
- Ecological Premium
#include<bits/stdc++.h> using namespace std; int main() { int n,m; unsigned long long int a,b, ...
- http://blog.csdn.net/jiazimo/article/details/17265061
http://blog.csdn.net/jiazimo/article/details/17265061