PHP策略分析,PHP策略模式

本篇文章给大家分享的内容是关于PHP策略模式,有着一定的参考价值,有需要的朋友可以参考一下

例如:一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示不同的广告

6 项目应用

6.1 需求说明

实现一个商场收银系统,商品可以有正常收费,打折收费,返利收费等模式(来之《大话设计模式》)

6.2 需求分析

按照需求,可以将收费操作设计成为一个接口算法,正常收费,打折收费,返利收费都继承这个接口,实现不同的策略算法。然后设计一个环境类,去维护策略的实例。

6.3 设计架构图

f35fbd460b560b8cb564926a8c08c6d5.png

6.4 程序源码下载

http://download.csdn.net/detail/clevercode/8700009

6.5 程序说明

1)strategy.php

[php] view plain copy

/**

* strategy.php

*

* 策略类:定义了一系列的算法,这些算法都是完成的相同工作,但是实现不同。

*

* 特别声明:本源代码是根据《大话设计模式》一书中的C#案例改成成PHP代码,和书中的

* 代码会有改变和优化。

*

* Copyright (c) 2015 http://blog.csdn.net/CleverCode

*

* modification history:

* --------------------

* 2015/5/5, by CleverCode, Create

*

*/

// 定义接口现金策略,每种策略都是具体实现acceptCash,但都是实现收取现金功能

interface ICashStrategy{

// 收取现金

public function acceptCash($money);

}

// 正常收取策略

class NormalStrategy implements ICashStrategy{

/**

* 返回正常金额

*

* @param double $money 金额

* @return double 金额

*/

public function acceptCash($money){

return $money;

}

}

// 打折策略

class RebateStrategy implements ICashStrategy{

// 打折比例

private $_moneyRebate = 1;

/**

* 构造函数

*

* @param double $rebate 比例

* @return void

*/

public function __construct($rebate){

$this->_moneyRebate = $rebate;

}

/**

* 返回正常金额

*

* @param double $money 金额

* @return double 金额

*/

public function acceptCash($money){

return $this->_moneyRebate * $money;

}

}

// 返利策略

class ReturnStrategy implements ICashStrategy{

// 返利条件

private $_moneyCondition = null;

// 返利多少

private $_moneyReturn = null;

/**

* 构造函数

*

* @param double $moneyCondition 返利条件

* @return double $moneyReturn 返利多少

* @return void

*/

public function __construct($moneyCondition, $moneyReturn){

$this->_moneyCondition = $moneyCondition;

$this->_moneyReturn = $moneyReturn;

}

/**

* 返回正常金额

*

* @param double $money 金额

* @return double 金额

*/

public function acceptCash($money){

if (!isset($this->_moneyCondition) || !isset($this->_moneyReturn) || $this->_moneyCondition == 0) {

return $money;

}

return $money - floor($money / $this->_moneyCondition) * $this->_moneyReturn;

}

}

2) strategyPattern.php

[php] view plain copy

/**

* strategyPattern.php

*

* 设计模式:策略模式

*

* 模式简介:

* 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,

* 不会影响到使用算法的客户。

* 策略模式是一种定义一些列算法的方法,从概念上来看,所有这些算法完成的都是

* 相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类

* 与使用算法类的耦合。

* 本源码中的各种结账方式,其实都是在结账,但是具体的实现确实不同的。策略模式与

* 命令模式不同的是,命令模式的算法是相互独立的,每个命令做的工作是不同的。而策略模式

* 却是在做通一种工作。

*

* 特别声明:本源代码是根据《大话设计模式》一书中的C#案例改成成PHP代码,和书中的

* 代码会有改变和优化。

*

* Copyright (c) 2015 http://blog.csdn.net/CleverCode

*

* modification history:

* --------------------

* 2015/5/14, by CleverCode, Create

*

*/

// 加载所有的策略

include_once ('strategy.php');

// 创建一个环境类,根据不同的需求调用不同策略

class CashContext{

// 策略

private $_strategy = null;

/**

* 构造函数

*

* @param string $type 类型

* @return void

*/

public function __construct($type = null){

if (!isset($type)) {

return;

}

$this->setCashStrategy($type);

}

/**

* 设置策略(简单工厂与策略模式混合使用)

*

* @param string $type 类型

* @return void

*/

public function setCashStrategy($type){

$cs = null;

switch ($type) {

// 正常策略

case 'normal' :

$cs = new NormalStrategy();

break;

// 打折策略

case 'rebate8' :

$cs = new RebateStrategy(0.8);

break;

// 返利策略

case 'return300to100' :

$cs = new ReturnStrategy(300, 100);

break;

}

$this->_strategy = $cs;

}

/**

* 获取结果

*

* @param double $money 金额

* @return double

*/

public function getResult($money){

return $this->_strategy->acceptCash($money);

}

/**

* 获取结果

*

* @param string $type 类型

* @param int $num 数量

* @param double $price 单价

* @return double

*/

public function getResultAll($type, $num, $price){

$this->setCashStrategy($type);

return $this->getResult($num * $price);

}

}

/*

* 客户端类

* 让客户端和业务逻辑尽可能的分离,降低客户端和业务逻辑算法的耦合,

* 使业务逻辑的算法更具有可移植性

*/

class Client{

public function main(){

$total = 0;

$cashContext = new CashContext();

// 购买数量

$numA = 10;

// 单价

$priceA = 100;

// 策略模式获取结果

$totalA = $cashContext->getResultAll('normal', $numA, $priceA);

$this->display('A', 'normal', $numA, $priceA, $totalA);

// 购买数量

$numB = 5;

// 单价

$priceB = 100;

// 打折策略获取结果

$totalB = $cashContext->getResultAll('rebate8', $numB, $priceB);

$this->display('B', 'rebate8', $numB, $priceB, $totalB);

// 购买数量

$numC = 10;

// 单价

$priceC = 100;

// 返利策略获取结果

$totalC = $cashContext->getResultAll('return300to100', $numC, $priceC);

$this->display('C', 'return300to100', $numC, $priceC, $totalC);

}

/**

* 打印

*

* @param string $name 商品名

* @param string $type 类型

* @param int $num 数量

* @param double $price 单价

* @return double

*/

public function display($name, $type, $num, $price, $total){

echo date('Y-m-d H:i:s') . ",$name,[$type],num:$num,price:$price,total:$total\r\n";

}

}

/**

* 程序入口

*/

function start(){

$client = new Client();

$client->main();

}

start();

?>

相关推荐:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值