例如:一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示不同的广告
6 项目应用
6.1 需求说明
实现一个商场收银系统,商品可以有正常收费,打折收费,返利收费等模式(来之《大话设计模式》)6.2 需求分析
按照需求,可以将收费操作设计成为一个接口算法,正常收费,打折收费,返利收费都继承这个接口,实现不同的策略算法。然后设计一个环境类,去维护策略的实例。6.3 设计架构图
6.4 程序源码下载
http://download.csdn.net/detail/clevercode/87000096.5 程序说明
1)strategy.php
- <?php
- /**
- * 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
- /**
- * 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();
- ?>