热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

money_tocash.php,PHP策略模式

本篇文章给大家分享的内容是关于PHP策略模式,有着一定的参考价值,有需要的朋友可以参考一下例如:一个电商网站系统,针对男性女

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

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

6 项目应用

6.1 需求说明

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

6.2 需求分析

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

6.3 设计架构图

d2d9547dfcb49813d29564e4fcdb5321.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();

?>

相关推荐:

实例分析PHP策略模式

PHP策略模式定义与用法实例详解



推荐阅读
author-avatar
用户0h2eqqbg44
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有