最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

PHP策略模式

来源:动视网 责编:小采 时间:2020-11-27 14:12:59
文档

PHP策略模式

PHP策略模式:本篇文章给大家分享的内容是关于PHP策略模式,有着一定的参考价值,有需要的朋友可以参考一下例如:一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示不同的广告6 项目应用6.1 需求说明 实现一个商场收银系统,商品可以有正
推荐度:
导读PHP策略模式:本篇文章给大家分享的内容是关于PHP策略模式,有着一定的参考价值,有需要的朋友可以参考一下例如:一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示不同的广告6 项目应用6.1 需求说明 实现一个商场收银系统,商品可以有正
 本篇文章给大家分享的内容是关于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 
    /** 
     * 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

  1. <?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
    "; 
     } 
    } 
     
    /** 
     * 程序入口 
     */ 
    function start(){ 
     $client = new Client(); 
     $client->main(); 
    } 
     
    start(); 
     
    ?>

文档

PHP策略模式

PHP策略模式:本篇文章给大家分享的内容是关于PHP策略模式,有着一定的参考价值,有需要的朋友可以参考一下例如:一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示不同的广告6 项目应用6.1 需求说明 实现一个商场收银系统,商品可以有正
推荐度:
标签: 模式 php 策略
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top