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