<?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);

最新文章

  1. JAVA Collections工具类sort()排序方法
  2. Python之路----------生成器
  3. Memcached 笔记与总结(7)增加虚拟节点
  4. hive中order by,sort by, distribute by, cluster by作用以及用法
  5. word2007无法执行语言识别
  6. c# monitor锁
  7. Quartz.Net CronExpression表达式详解
  8. php不允许用户提交空表单(php空值判断)
  9. 已安装好的tengine编译添加未被安装的模块
  10. uva 10994 - Simple Addition
  11. ApiGen4.1 windows安装教程
  12. T_SQL编程赋值、分支语句、循环
  13. [Swift]LeetCode903. DI 序列的有效排列 | Valid Permutations for DI Sequence
  14. Java接口实现传参
  15. 用word发CSDN blog,免去插图片的烦恼
  16. 一些oracle的经验
  17. php实现一个简单的四则运算计算器
  18. 身在上海的她,该不该继续&quot;坚持&quot;前端开发?
  19. unity美少女动作RPG游戏源码Action-RPG Starter Kit v5.0a
  20. Django入门指南-第8章:第一个测试用例(完结)

热门文章

  1. codeforces 714C解题报告
  2. SSH开源框架考试题
  3. oppo X907刷机包 COLOROS 1.0 正式版公布 安卓4.2.2
  4. C的printf与scanf的用法
  5. PHP超级全局变量总结
  6. JS家的排序算法
  7. (转载)github简单使用教程
  8. java注释 命名 数据类型 基本类型转换 位运算符 逻辑运算符 三目运算符
  9. javascript split() 正则表达式
  10. 关于json中对象的删除