什么是策略模式?

定义:
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

组成:
抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
具体策略角色:包装了相关的算法和行为。
环境角色:持有一个策略类的引用,最终给客户端调用。

百度了一下,还是没有搞明白策略模式与工厂模式的本质区别,只是有了一些表象的理解。

我将工厂模式中用到的例子进行了改写:

工厂模式:http://www.tinysoft.me/index.php/archives/27/

即所谓的策略模式,代码如下

<?php
/*定义抽象类*/
abstract class Operate {
public abstract function get_Value($val1, $val2);
} /*加法类*/
Class Operate_Add extends Operate {
public function get_Value($val1, $val2) {
return $val1 + $val2;
}
} /*减法类*/
Class Operate_Sub extends Operate {
public function get_Value($val1, $val2) {
return $val1 - $val2;
}
} /*乘法类*/
Class Operate_Multiply extends Operate {
public function get_Value($val1, $val2) {
return $val1 * $val2;
}
} /*除法类*/
Class Operate_Divide extends Operate {
public function get_Value($val1, $val2) {
return $val1 / $val2;
}
} /*上下文类*/
Class Context { private static $op; public static function Create_Operation($operate) {
Switch($operate) {
Case '+': self::$op = new Operate_Add;
break; Case '-': self::$op = new Operate_Sub;
break; Case '*': self::$op = new Operate_Multiply;
break; Case '/': self::$op = new Operate_Divide;
break;
} }
public function get_Result($val1, $val2) {
return self::$op->get_Value($val1, $val2);
}
} $mys = new Context;
$mys->Create_Operation ('+');
$result = $mys->get_Result(1, 2);
echo $result;

网上一篇关于工厂模式与策略模式区别的解析:

1、按一般教程中出现的例子理解

简单工厂模式:传条件进工厂类,工厂类就会返回一个对象给调用者,供调用者使用,最终给用户使用的是工厂类返回的类

策略模式:创建一个Context类(可以看作是工厂模式中工厂类的代替品)的对象A,传一个要使用的策略实例对象给A,然后使用A调用A中的某些方法---最终给用户用的是Context类

简单的说,工厂有进货也有出货,然后使用出货。策略有进货没出货,然后使用得货者。

2、更准确理解

用户是使用工厂类生产的对象进行操作,而用户是使用用户自己传给策略的对象进行操作。

简单的说,工厂类的使用者需要不是自己创建的对象,策略模式中Context类的使用者需要的是自己创建的对象。

更简单的说,工厂模式:我没有,我需要你的。策略模式:我自己有,我用我自己的。

本人认为上述对工厂模式和策略模式的理解还是比较不错的,至少对于刚接触到的新手还是很容易理解的,具体的深度解析,还需要在项目中不断的实践!

上述代码似乎与我们平时所做的系统联系不大,我下面举一个web开发中要用到的例子,能加深对策略模式的理解。

假设我们有一套商城系统,商城系统中不可避免的有会员系统,会员分为普通会员、银会员、金会员,针对不同的会员我们有不同的打折措施,不同的打折措施,影响会员对商品的支付金额不同。

<?php
/*抽象策略接口*/
interface Member {
public function get_Price($price);
}
/*具体算法策略*/
class Normal_Member implements Member {
public function get_Price($price) {
return $price;
}
} class Vip_Member implements Member {
public function get_Price($price) {
return $price*0.8;
}
} class Ultimate_Member implements Member {
public function get_Price($price) {
return $price*0.6;
}
}
/*环境上下文,获得抽象策略的引用*/
class Context {
private $instance;
public function __construct($instance) {
$this->instance = $instance;
} public function get_Result($price) {
return $this->instance->get_Price($price);
}
} $p = new Context(new Ultimate_Member);
echo $p->get_Result(100);
?>

抽象策略角色:定义所有支持的算法的公共接口,通常是以一个接口或抽象来实现,Context使用这个接口来调用其定义的算法。
具体策略角色:以抽象策略角色接口实现某具体算法。
环境角色:持有一个抽象策略角色类的引用,并返回操作结果。

大话设计模式之PHP篇 - 策略模式的更多相关文章

  1. &lt;二&gt;读&lt;&lt;大话设计模式&gt;&gt;之策略模式

    又和大家见面了.可以坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>解说策略模式是以商场收银软件程序开头的,那么问题来了.哪家商场收银软件强,开玩笑了. 读过上篇文章 ...

  2. 大话设计模式C++版——抽象工厂模式

    前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种——抽象工厂模式(Abstract Facto ...

  3. 大话设计模式C++版——工厂方法模式

    工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版——简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发—封闭原则,其主 ...

  4. JavaScript设计模式与开发实践 - 策略模式

    引言 本文摘自<JavaScript设计模式与开发实践> 在现实中,很多时候也有多种途径到达同一个目的地.比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但 ...

  5. Java设计模式(18)策略模式(Strategy模式)

    Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...

  6. php设计模式课程---6、策略模式如何使用

    php设计模式课程---6.策略模式如何使用 一.总结 一句话总结:比如代码需求,做一饭店,有南北方不同菜系,不同分店有不同的饭菜汤的需求,代码怎么设计 从饭店有特色过渡到厨师有特色(南方厨师(南方饭 ...

  7. Java设计模式菜鸟系列(一)策略模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39721563 今天開始咱们来谈谈Java设计模式. 这里会结合uml图形来解说,有对uml ...

  8. 大话设计模式C++版——简单工厂模式

    简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class I ...

  9. php设计模式-------(1)策略模式

    一.为什么我要学习设计模式. 我的上一个项目是做App接口,由于时间紧,老板催的急,所以到最后项目完工时发现居然写了几万行代码,可想而知代码质量有多糟糕.而且很多时候,调用接口的开发人员来找我说某个接 ...

随机推荐

  1. ECharts:企业报表工具

    ECharts.纯Javascript图表库,基于Canvas,底层依赖ZRender.商业产品经常使用图表库,提供直观,生动.可交互,可个性化定制的数据可视化图表.创新的拖拽重计算.数据视图.值域漫 ...

  2. AndroidHttpClient和HttpEntity详解

    AndroidHttpClient结构: public final class AndroidHttpClient extends Object implements HttpClient 前言:这类 ...

  3. Vue实现远程获取路由与页面刷新导致404错误的解决

    一.背景 先简单介绍一下现在项目情况:前后端分离,后端服务是Java写的,前端是Vue+ElementUI. 最近的一个需求是:通过后端Api去获取前端路由表,原因是每个登录角色对应的前端路由表可能是 ...

  4. Zookeeper权限管理与Quota管理

    Zookeeper的ACL机制和Quota机制网上资料较少,这里做一个总结,以供大家参考. 1 Zookeeper ACL ZooKeeper的权限管理亦即ACL控制功能通过Server.Client ...

  5. HDOJ 4549 M斐波那契数列 费马小定理+矩阵高速幂

    MF( i ) = a ^ fib( i-1 ) * b ^ fib ( i )   ( i>=3) mod 1000000007 是质数 , 依据费马小定理  a^phi( p ) = 1 ( ...

  6. ADB简易安装方法

    ADB安装方法: 1. 下载ADB程序 下载地址: 链接:https://pan.baidu.com/s/1CfQL51pBz-2Wk_cYfJYXUw  提取码:bjp8 2. 配置环境变量 pat ...

  7. 【BZOJ2384】[Ceoi2011]Match KMP

    [BZOJ2384][Ceoi2011]Match Description 作为新一轮广告大战的一部分,格丁尼亚的一家大公司准备在城市的某处设置公司的标志(logo).公司经理决定用一些整栋的建筑来构 ...

  8. ehcarts之toolbox,工具栏

    toolbox 工具栏.内置有导出图片,数据视图,动态类型切换,数据区域缩放,重置五个工具. feature各工具配置项.具体显示功能 1.saveAsImage 保存为图片. 2.restore 还 ...

  9. urlencode rawurlencode htmlspecialchars htmlentities

    w string urlencode ( string $str ) 返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+).此 ...

  10. 基于java mail实现简单的QQ邮箱发送邮件

    刚学习到java邮件相关的知识,先写下这篇博客,方便以后翻阅学习. -----------------------------第一步 开启SMTP服务 在 QQ 邮箱里的 设置->账户里开启 S ...