PHP策略模式

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

6 项目应用


6.1 需求说明

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


6.2 需求分析

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


6.3 设计架构图



6.4 程序源码下载

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

6.5 程序说明

1)strategy.php

[php]  view plain  copy
  1. <?php  
  2. /** 
  3.  * strategy.php 
  4.  * 
  5.  * 策略类:定义了一系列的算法,这些算法都是完成的相同工作,但是实现不同。 
  6.  *   
  7.  * 特别声明:本源代码是根据《大话设计模式》一书中的C#案例改成成PHP代码,和书中的 
  8.  * 代码会有改变和优化。 
  9.  * 
  10.  * Copyright (c) 2015 http://blog.csdn.net/CleverCode 
  11.  * 
  12.  * modification history: 
  13.  * -------------------- 
  14.  * 2015/5/5, by CleverCode, Create 
  15.  * 
  16.  */  
  17.   
  18. // 定义接口现金策略,每种策略都是具体实现acceptCash,但都是实现收取现金功能  
  19. interface ICashStrategy{  
  20.     // 收取现金  
  21.     public function acceptCash($money);  
  22. }  
  23.   
  24. // 正常收取策略  
  25. class NormalStrategy implements ICashStrategy{  
  26.   
  27.     /** 
  28.      * 返回正常金额 
  29.      * 
  30.      * @param double $money 金额 
  31.      * @return double 金额 
  32.      */  
  33.     public function acceptCash($money){  
  34.         return $money;  
  35.     }  
  36. }  
  37.   
  38. // 打折策略  
  39. class RebateStrategy implements ICashStrategy{  
  40.     // 打折比例  
  41.     private $_moneyRebate = 1;  
  42.   
  43.     /** 
  44.      * 构造函数 
  45.      * 
  46.      * @param double $rebate 比例 
  47.      * @return void 
  48.      */  
  49.     public function __construct($rebate){  
  50.         $this->_moneyRebate = $rebate;  
  51.     }  
  52.   
  53.     /** 
  54.      * 返回正常金额 
  55.      * 
  56.      * @param double $money 金额 
  57.      * @return double 金额 
  58.      */  
  59.     public function acceptCash($money){  
  60.         return $this->_moneyRebate * $money;  
  61.     }  
  62. }  
  63.   
  64. // 返利策略  
  65. class ReturnStrategy implements ICashStrategy{  
  66.     // 返利条件  
  67.     private $_moneyCondition = null;  
  68.       
  69.     // 返利多少  
  70.     private $_moneyReturn = null;  
  71.   
  72.     /** 
  73.      * 构造函数 
  74.      * 
  75.      * @param double $moneyCondition 返利条件 
  76.      * @return double $moneyReturn 返利多少 
  77.      * @return void 
  78.      */  
  79.     public function __construct($moneyCondition$moneyReturn){  
  80.         $this->_moneyCondition = $moneyCondition;  
  81.         $this->_moneyReturn = $moneyReturn;  
  82.     }  
  83.   
  84.     /** 
  85.      * 返回正常金额 
  86.      * 
  87.      * @param double $money 金额 
  88.      * @return double 金额 
  89.      */  
  90.     public function acceptCash($money){  
  91.         if (!isset($this->_moneyCondition) || !isset($this->_moneyReturn) || $this->_moneyCondition == 0) {  
  92.             return $money;  
  93.         }  
  94.           
  95.         return $money - floor($money / $this->_moneyCondition) * $this->_moneyReturn;  
  96.     }  
  97. }  

2)   strategyPattern.php

[php]  view plain  copy
  1. <?php  
  2. /** 
  3.  * strategyPattern.php 
  4.  * 
  5.  * 设计模式:策略模式 
  6.  *  
  7.  * 模式简介: 
  8.  *     它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 
  9.  * 不会影响到使用算法的客户。 
  10.  *     策略模式是一种定义一些列算法的方法,从概念上来看,所有这些算法完成的都是 
  11.  * 相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类 
  12.  * 与使用算法类的耦合。 
  13.  *     本源码中的各种结账方式,其实都是在结账,但是具体的实现确实不同的。策略模式与 
  14.  * 命令模式不同的是,命令模式的算法是相互独立的,每个命令做的工作是不同的。而策略模式 
  15.  * 却是在做通一种工作。           
  16.  *  
  17.  * 特别声明:本源代码是根据《大话设计模式》一书中的C#案例改成成PHP代码,和书中的 
  18.  * 代码会有改变和优化。 
  19.  * 
  20.  * Copyright (c) 2015 http://blog.csdn.net/CleverCode 
  21.  * 
  22.  * modification history: 
  23.  * -------------------- 
  24.  * 2015/5/14, by CleverCode, Create 
  25.  * 
  26.  */  
  27.   
  28. // 加载所有的策略  
  29. include_once ('strategy.php');  
  30.   
  31. // 创建一个环境类,根据不同的需求调用不同策略  
  32. class CashContext{  
  33.       
  34.     // 策略  
  35.     private $_strategy = null;  
  36.   
  37.     /** 
  38.      * 构造函数 
  39.      * 
  40.      * @param string $type 类型 
  41.      * @return void 
  42.      */  
  43.     public function __construct($type = null){  
  44.         if (!isset($type)) {  
  45.             return;  
  46.         }  
  47.         $this->setCashStrategy($type);  
  48.     }  
  49.   
  50.     /** 
  51.      * 设置策略(简单工厂与策略模式混合使用) 
  52.      * 
  53.      * @param string $type 类型 
  54.      * @return void 
  55.      */  
  56.     public function setCashStrategy($type){  
  57.         $cs = null;  
  58.         switch ($type) {  
  59.               
  60.             // 正常策略  
  61.             case 'normal' :  
  62.                 $cs = new NormalStrategy();  
  63.                 break;  
  64.               
  65.             // 打折策略  
  66.             case 'rebate8' :  
  67.                 $cs = new RebateStrategy(0.8);  
  68.                 break;  
  69.               
  70.             // 返利策略  
  71.             case 'return300to100' :  
  72.                 $cs = new ReturnStrategy(300, 100);  
  73.                 break;  
  74.         }  
  75.         $this->_strategy = $cs;  
  76.     }  
  77.   
  78.     /** 
  79.      * 获取结果 
  80.      * 
  81.      * @param double $money 金额 
  82.      * @return double 
  83.      */  
  84.     public function getResult($money){  
  85.         return $this->_strategy->acceptCash($money);  
  86.     }  
  87.   
  88.     /** 
  89.      * 获取结果 
  90.      * 
  91.      * @param string $type 类型 
  92.      * @param int $num 数量 
  93.      * @param double $price 单价 
  94.      * @return double 
  95.      */  
  96.     public function getResultAll($type$num$price){  
  97.         $this->setCashStrategy($type);  
  98.         return $this->getResult($num * $price);  
  99.     }  
  100. }  
  101.   
  102. /* 
  103.  * 客户端类 
  104.  * 让客户端和业务逻辑尽可能的分离,降低客户端和业务逻辑算法的耦合, 
  105.  * 使业务逻辑的算法更具有可移植性 
  106.  */  
  107. class Client{  
  108.   
  109.     public function main(){  
  110.         $total = 0;  
  111.           
  112.         $cashContext = new CashContext();  
  113.           
  114.         // 购买数量  
  115.         $numA = 10;  
  116.         // 单价  
  117.         $priceA = 100;  
  118.         // 策略模式获取结果  
  119.         $totalA = $cashContext->getResultAll('normal'$numA$priceA);  
  120.         $this->display('A''normal'$numA$priceA$totalA);  
  121.           
  122.         // 购买数量  
  123.         $numB = 5;  
  124.         // 单价  
  125.         $priceB = 100;  
  126.         // 打折策略获取结果  
  127.         $totalB = $cashContext->getResultAll('rebate8'$numB$priceB);  
  128.         $this->display('B''rebate8'$numB$priceB$totalB);  
  129.           
  130.         // 购买数量  
  131.         $numC = 10;  
  132.         // 单价  
  133.         $priceC = 100;  
  134.         // 返利策略获取结果  
  135.         $totalC = $cashContext->getResultAll('return300to100'$numC$priceC);  
  136.         $this->display('C''return300to100'$numC$priceC$totalC);  
  137.     }  
  138.   
  139.     /** 
  140.      * 打印 
  141.      * 
  142.      * @param string $name 商品名 
  143.      * @param string $type 类型 
  144.      * @param int $num 数量 
  145.      * @param double $price 单价 
  146.      * @return double 
  147.      */  
  148.     public function display($name$type$num$price$total){  
  149.         echo date('Y-m-d H:i:s') . ",$name,[$type],num:$num,price:$price,total:$total\r\n";  
  150.     }  
  151. }  
  152.   
  153. /** 
  154.  * 程序入口 
  155.  */  
  156. function start(){  
  157.     $client = new Client();  
  158.     $client->main();  
  159. }  
  160.   
  161. start();  
  162.   
  163. ?>  
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值