概述

策略模式属于对象的行为模式。其用意是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化

UML图





策略模式中主要角色

这个模式设计到三个角色:
  • 环境角色(Context):持有一个Strategy的引用
  • 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体的策略类所需的接口
  • 具体策略(ConcreateStrategy)角色:包装了相关的算法或行为

使用场景

假设现在要设计一个购物车系统,一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这个复杂。例如:对普通会员无折扣,对中级会员提供8折优惠,对高级会员提供7折优惠。

根据上述描述,货品价格是根据以下几个算法中的一个进行的:

  • 对普通会员无折扣
  • 对中级会员8折
  • 对高级会员7折

UML图




实现代码

<?php

/**
* 策略抽象类
* @author wzy
*
*/
interface Strategy
{ public function calPrice ($price);
} /**
* 普通会员策略类
*
* @author wzy
*
*/
class PrimaryStrategy implements Strategy
{ public function calPrice ($price)
{
echo "普通会员无折扣";
return $price;
}
} /**
* 中级会员策略类
*
* @author wzy
*
*/
class MiddleStrategy implements Strategy
{ public function calPrice ($price)
{
echo "中级会员8折优惠";
return $price * 0.8;
}
} /**
* 高级会员策略类
*
* @author wzy
*
*/
class HighStrategy implements Strategy
{ public function calPrice ($price)
{
echo "高级会员7折优惠";
return $price * 0.7;
}
} /**
* Context实现类
*
* @author wzy
*
*/
class Price
{ /**
* 具体的策略类对象
*
* @var object
*/
private $strategyInstance; /**
* 构造函数,传入一个具体的策略对象
*
* @param object $instance
*/
public function __construct ($instance)
{
$this->strategyInstance = $instance;
} /**
* 计算货品的价格
*
* @param double $price
*/
public function quote ($price)
{
return $this->strategyInstance->calPrice($price);
}
} /**
* 客户端操作
*/ $high = new HighStrategy();
$priceClass = new Price($high);
$price = $priceClass->quote(400);
echo $price;
?>

回顾策略模式

策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的扩展性和维护性

算法的平等性

策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是一样的,这样才能实现算法之间的互相转换

运行时策略的唯一性

运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只有一个

PHP设计模式——策略模式的更多相关文章

  1. 15. 星际争霸之php设计模式--策略模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型)

    [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它 ...

  3. linkin大话设计模式--策略模式

    linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi]  策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...

  4. [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)

    [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...

  5. 设计模式-策略模式(Strategy Model)

    1.概述     在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能.     如在人物比较排序的实现中,我们有 ...

  6. java设计模式 策略模式Strategy

    本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...

  7. [Head First设计模式]策略模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  8. javascript 设计模式-----策略模式

    在<javascript设计模式>中,作者并没有向我们介绍策略模式,然而它却是一种在开发中十分常见的设计模式.最常见的就是当我们遇到一个复杂的表单验证的时候,常常需要编写一大段的if和el ...

  9. JAVA 设计模式 策略模式

    用途 Title 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 策略模式是一种行为型模式. 结构

  10. PHP设计模式-策略模式 转

    策略模式(Strategy Pattern) 策略模式是对象的行为模式,用意是对一组算法的封装.动态的选择需要的算法并使用. 策略模式指的是程序中涉及决策控制的一种模式.策略模式功能非常强大,因为这个 ...

随机推荐

  1. perl5 第六章 模式匹配

    第六章 模式匹配 by flamephoenix 一.简介二.匹配操作符三.模式中的特殊字符  1.字符+  2.字符 []和[^]  3.字符 *和?  4.转义字符  5.匹配任意字母或数字  6 ...

  2. 程序员眼中的UML

    --克服用例图的恐惧 在实际工作中,大部分程序员很少接触到需求分析,即使有需求分析,也是草草了事,没有用正规的方式来表达,所以一般程序员使用用例图的机会是不多的.但是却又常常在各种媒体上看见用例图,于 ...

  3. JAVA的IO学习

    IO 有具体的分类: 有具体的分类:1:根据处理的数类型不同:字节流和字符流.2:根据流向不同:输入流和输出流. =============(补充字节跟字符概念区分)================= ...

  4. 使用Linux静态库

    查看静态库.a文件包含的内容用下面的命令解压: ar x libgdal.a 然后就可以查看文件了: ls adler32.o cpl_recode.o dted_create.o gdalpamra ...

  5. 用elasticsearch索引mongodb数据

    参照网页:单机搭建elasticsearch和mongodb的river 三个步骤: 一,搭建单机replicSet二,安装mongodb-river插件三,创建meta,验证使用 第一步,搭建单机m ...

  6. MySQL的字段设计

    1.尽量使用数字,因为文本占空间,不利于查询(针对有限种类文本)

  7. linux: telnet

    问题: telnet: connect to address 192.168.1.103: Connection refused 总结:{ 1. 需要开启telnet服务, /etc/xinetd.d ...

  8. UVa---------10935(Throwing cards away I)

    题目: Problem B: Throwing cards away I Given is an ordered deck of n cards numbered 1 to n with card 1 ...

  9. C++之类与对象(1)

    下个阶段,我将讲解C++中面向对象的部分,也是C++对C语言改进的最重要的部分.以前C++也被叫做是"带类的C".今天主要讲类的构成,成员函数以及对象的定义和使用. 1.其实这一节 ...

  10. Android发送数据到web服务器4种方式

    1./** 2. * Android中向web服务器提交数据的两种方式四种方法 3. */ 4.public class SubmitDataByHttpClientAndOrdinaryWay { ...