当前位置: 首页 > news >正文

大话设计模式第二章---商场促销简单工厂模式、策略模式 PHP实现及对比

简单工厂模式:

<?php
abstract class Cash_super {
    abstract public function accept_cash(float $money);
}

class Cash_normal extends Cash_super {
    public function accept_cash(float $money) {
        return $money;
    }
}

class Cash_rebate extends Cash_super {
    private $_money_rebate;
    public function __construct(float $money_rebate) {
        $this->_money_rebate = $money_rebate;
    }

    public function accept_cash(float $money) {
        return $money * $this->_money_rebate;
    }
}

class Cash_return extends Cash_super {
    private $_money_condition = 0;
    private $_money_return = 0;

    public function __construct(float $money_condition, float $money_return) {
        $this->_money_condition = $money_condition;
        $this->_money_return = $money_return;
    }
    public function accept_cash(float $money) {
        $result = $money;
        if ($money >= $this->_money_condition) {
            return $money - floor($money/$this->_money_condition) * $this->_money_return;
        }
        return $result;
    }
}

class Cash_factory {
    public static function create_cash_accept($type) : Cash_super {
        $cs = null;
        switch ($type) {
        case 'normal':
            $cs = new Cash_normal();
            break;
        case '300-100':
            $cs = new Cash_return(300, 100);
            break;
        case '0.8':
            $cs = new Cash_rebate(0.8);
            break;
        }
        return $cs;
    }
}

$csuper = Cash_factory::create_cash_accept('300-100');
$total_price = $csuper->accept_cash(30000);
echo $total_price;

(简单工厂模式UML)

 

 

策略与简单工厂模式的组合:

class Cash_context {
    private $cs = null;

    public function __construct($type) {
        switch ($type) {
        case 'normal':
            $this->cs = new Cash_normal();
            break;
        case '300-100':
            $this->cs = new Cash_return(300,100);
            break;
        case '0.8':
            $this->cs = new Cash_rebate(0.8);
            break;
        }
    }

    public function get_result($money) {
        return $this->cs->accept_cash($money);
    }
}

$cc = new Cash_context('300-100');
$total_price = 0;
$total_price = $cc->get_result(5000);
echo $total_price;

 

 

说明:

  简单工厂模式需要让客户端认识两个类。Cash_super和Cash_factory。

  策略与简单工厂结合,客户端只需要认识一个类 Cash_context,降低了耦合。

  策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法之间的耦合;

转载于:https://www.cnblogs.com/wy0314/p/4768387.html

相关文章:

  • linux运维实战练习-2015年8月27日课程作业
  • 《NoSQL For Mere Mortals》书评与作者问答录
  • django 1.8 官方文档翻译: 13-1-1 Django 中的用户认证
  • Linux 日志
  • iOS开发之如何修改导航栏的内容
  • Jboss7.1 加入realm auth认证 bootsfaces 美化的登录页面
  • BZOJ 3436: 小K的农场 差分约束
  • 2cifang.com_2次方学习
  • 关于深拷贝(含数组对象)
  • 使用Lua和OpenResty搭建验证码服务器 - JavaChen Blog
  • logrotate机制与原理[转载]
  • Fresco源码解析 - DataSource怎样存储数据
  • 官方API Demos中自定义adapter写法
  • 用指针方法排序数组
  • Linux下Nagios的安装与配置(转载)
  • ----------
  • ES6指北【2】—— 箭头函数
  • 【css3】浏览器内核及其兼容性
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • Apache Zeppelin在Apache Trafodion上的可视化
  • canvas 绘制双线技巧
  • Laravel5.4 Queues队列学习
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • node-glob通配符
  • Swift 中的尾递归和蹦床
  • Zsh 开发指南(第十四篇 文件读写)
  • 闭包,sync使用细节
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 服务器之间,相同帐号,实现免密钥登录
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 深入浏览器事件循环的本质
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 如何在招聘中考核.NET架构师
  • ​2020 年大前端技术趋势解读
  • ​queue --- 一个同步的队列类​
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (pojstep1.3.1)1017(构造法模拟)
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (一) storm的集群安装与配置
  • (转)可以带来幸福的一本书
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • ./configure,make,make install的作用
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • /var/log/cvslog 太大
  • @ResponseBody
  • @SentinelResource详解
  • [Android]Android开发入门之HelloWorld
  • [AutoSar]BSW_Com02 PDU详解
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • [bzoj1901]: Zju2112 Dynamic Rankings
  • [CSS]浮动
  • [Hive] INSERT OVERWRITE DIRECTORY要注意的问题
  • [IE编程] IE8 新增的C++开发接口