<?php
abstract class Strategy
{
    public abstract function AlgorithmInterface();
}

class ConcreteStrategyA extends Strategy
{
    public function AlgorithmInterface()
    {
        // 实现细节
    }
}

class ConcreteStrategyB extends Strategy
{
    public function AlgorithmInterface()
    {
        // 实现细节
    }
}

class ConcreteStrategyC extends Strategy
{
    public function AlgorithmInterface()
    {
        // 实现细节
    }
}

/* *************************************** */
// 配置
class Context
{
    public $strategy;

public function __construct($strategy)
    {
        $this->strategy = $strategy;
    }

public function ContextInterface()
    {
        $this->strategy->AlgorithmInterface();
    }
}

// 实现过程
$context = new Context(new ConcreteStrategyA());
$context.ContextInterface();

$context = new Context(new ConcreteStrategyB());
$context.ContextInterface();

$context = new Context(new ConcreteStrategyC());
$context.ContextInterface();

/* ********************************* */
// 策略模式具体实现

abstract class CashSuper
{
    public abstract function acceptCash($money);
}

// 正常收费
class CashNormal extends CashSuper
{
    public function acceptCash($money)
    {
        return $money;
    }
}

// 打折收费
class CashRebate extends CashSuper
{
    private $moneyReturn;

public function __construct($moneyReturn)
    {
        $this->moneyReturn = $moneyReturn;
    }

public function acceptCash($money)
    {
        return $money * $this->moneyReturn;
    }
}

// 返利收费
class CashReturn extends CashSuper
{
    private $moneyCondtion;
    private $moneyReturn;
    
    function __construct($moneyCondition, $moneyReturn)
    {
        $this->moneyCondtion = $moneyCondition;
        $this->moneyReturn = $moneyReturn;
    }

public function acceptCash($money)
    {
        $result = $money;
        if($money >= $this->moneyCondtion)
            $result = $money - Math.Float($money/$this->moneyCondition) * $this->moneyReturn;
        return $result;
    }    
}

// 实现

class CashContext
{
    // 为一个构造实现一子类
    private cs;
    public function __construct($cashSuper)
    {
        $this->cs = $cashSuper;
    }

public function GetResult($money)
    {
        return cs.acceptCash($money);
    }
}
/**
    @param $flag 检测收费方式
    @param $old 正常价格
    @param $back 返回利率
    @param $condtion 正常价格
    @param $conditionback 应返回的利率
    @param $money 实现的金额
 */
$flag;
$old, $back;
$condtion, $conditionback;
$money;
switch($flag)
{
    case "normal":
        $res = new CashContext(new CashNormal());
        break;
  case "打折":
        $res = new CashContext(new CashRebate($old, $back));
        break;
    case "返利":
        $res = new CashContext(new CashReturn($conditon, $conditionback));
        break;
}
$res.acceptCash($money);

/** ********************************** */
// 策略模式与工厂模式结合,只需修改 CashContext即可

/**
    @param $flag 检测收费方式
    @param $old 正常价格
    @param $back 返回利率
    @param $condtion 正常价格
    @param $conditionback 应返回的利率
    @param $money 实现的金额
 */
// 用到时把参数修改为实际数字即可
class CashContext
{
    // 为一个构造实现一子类
    private cs;
    private $flag;
    public function __construct($flag)
    {
        $this->flag = $flag;
    }

public function GetResult($money)
    {
        switch($this->flag)
        {
            case "normal":
                $res = new CashContext(new CashNormal());
                break;
            case "打折":
                $res = new CashContext(new CashRebate($old, $back));
                break;
            case "返利":
                $res = new CashContext(new CashReturn($conditon, $conditionback));
                break;
        }
        return $res.acceptCash($money);
    }
}

$flag;
$res = new CashContext($flag);
$res.acceptCash($money);

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

  1. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

  2. PHP设计模式之策略模式

    前提: 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查 找.排序等,一种常用的方法是硬编码(Hard Cod ...

  3. JavaScript设计模式之策略模式(学习笔记)

    在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选 ...

  4. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  5. JavaScript设计模式之策略模式

    所谓"条条道路通罗马",在现实中,为达到某种目的往往不是只有一种方法.比如挣钱养家:可以做点小生意,可以打分工,甚至还可以是偷.抢.赌等等各种手段.在程序语言设计中,也会遇到这种类 ...

  6. 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查

    原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...

  7. [design-patterns]设计模式之一策略模式

    设计模式 从今天开始开启设计模式专栏,我会系统的分析和总结每一个设计模式以及应用场景.那么首先,什么是设计模式呢,作为一个软件开发人员,程序人人都会写,但是写出一款逻辑清晰,扩展性强,可维护的程序就不 ...

  8. 设计模式入门,策略模式,c++代码实现

    // test01.cpp : Defines the entry point for the console application.////第一章,设计模式入门,策略模式#include &quo ...

  9. 设计模式之策略模式和状态模式(strategy pattern & state pattern)

    本文来讲解一下两个结构比较相似的行为设计模式:策略模式和状态模式.两者单独的理解和学习都是比较直观简单的,但是实际使用的时候却并不好实践,算是易学难用的设计模式吧.这也是把两者放在一起介绍的原因,经过 ...

  10. python设计模式之策略模式

    每次看到项目中存在大量的if else代码时,都会心生一丝不安全感. 特别是产品给的需求需要添加或者更改一种if条件时,生怕会因为自己的疏忽而使代码天崩地裂,哈哈,本文的目的就是来解决这种不安全感的, ...

随机推荐

  1. hadoop家族之mahout安装

    步骤一.下载mahout  http://www.apache.org/dyn/closer.cgi/mahout/ 我下载的是 mahout-distribution-0.9.tar.gz 16-F ...

  2. Centos6.4 openNebula

    OpenNebula 是一套开源的云计算基础管理工具,用来方便管理员在数据中心统一部署.创建.分配和管理大量的虚拟机,企业数据中心可以利用这套工具搭建自己的私有云,为 自己内部提供 IaaS 服务,类 ...

  3. UVA 6199 不定根最小树形图

    首先是最小树形图的介绍. 看这个博客.最小树形图 上面介绍的很详细了,我就讲一下这道题的题意. 首先给出一些二维点坐标,这些坐标之间构成一些有向图,根据题意,假设两个点a(x1 ,y1) ,b(x2 ...

  4. web前后台数据交互的四种方式(转)

    1.利用cookie对象  Cookie是服务器保存在客户端中的一小段数据信息.使用Cookie有一个前提,就是客户端浏览器允许使用Cookie并对此做出相应的设置.一般不赞成使用Cookie. (1 ...

  5. Jakarta-Commons- BeanUtils学习笔记:

    http://www.cnblogs.com/zhangyi85/archive/2009/04/22/1441341.html 1.什么是BeanUtils: BeanUtils主要提供了对于Jav ...

  6. Jsp中的EL表达式

    EL表达式作用: 向浏览器输出域对象中的变量值或表达式计算的结果!!! 语法: ${变量或表达式} 可以通过page指令来设置EL表示是否启用,false是不启用,true是启用,默认是true &l ...

  7. 怎样使用SetTimer MFC 够具体

    转自:http://blog.csdn.net/ellor/article/details/1714741 Timer事件,即定时器事件,是在游戏编程中,常常使用的一个事件.借助它能够产生定时运行动作 ...

  8. 关于Parse库的配置问题

    在使用Parse的一些相关服务时候,需要下载Parse的SDK,除了需要添加相应的系统框架和库的支持 AudioToolbox.framework CFNetwork.framework CoreGr ...

  9. Hrbust1328 相等的最小公倍数 (筛素数,素因子分解)

    本文出自:http://blog.csdn.net/svitter/ 题意: 求解An 与 An-1是否相等. n分为两个情况-- 1.n为素数, 2.n为合数. =  =好像说了个废话..素数的时候 ...

  10. 史上比较用心的纯代码实现 AutoLayout

    入职有两三个月了吧,都是使用 Objective-C 纯代码(虽然有时候偷偷参杂一些 Swift 开源库)来编写公司APP,写布局的时候几乎都是要么在初始化的时候用 initWithFrame,要么就 ...