大话设计模式第二章---商场促销简单工厂模式、策略模式 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;

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

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,降低了耦合。

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

时间: 2024-10-25 18:41:03

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

第2章商场促销(2)——策略模式

/*shop.h文件*/ #ifndef _SHOP_ #define _SHOP_ #include<iostream> #include<string> //现金收费抽象类 class Cashsuper { public: virtual double acceptcash(double money); }; //正常收费子类 class cashnormal:public Cashsuper { public: virtual double acceptcash(doubl

对设计模式的总结之简单工厂与策略模式

前言 面向对象编程追求的本质-提高扩展性.可维护性.灵活性和复用性.合理利用面向对象6个原则,能够很好的达到要求.如何利用好就是至关重要的了,前人总结了23+个设计模式能够让初学者更容易学到其中的精髓,本文就说说我对本人对简单工厂模式.策略模式的见解. 简单工厂模式与策略模式 简单工厂模式 工作中,常常遇到需要做一个功能(鸭子),这个功能中含有可控个数的子操作功能(鸭子叫,鸭子跑,鸭子飞),而且子功能在不同的情况下处理方式又不相同(成年鸭子/小鸭子叫,成年鸭子/小鸭子跑,成年鸭子/小鸭子飞).我

简单工厂与策略模式

简单工厂模式 专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类.它又称为静态工厂方法模式,属于类的创建型模式.简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. 该模式中包含的角色及其职责: 1.工厂(Creator)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑.工厂类可以被外界直接调用,创建所需的产品对象. 2.抽象(Product)角色 简单工厂模式所创建的所有对象的父类,它负责描述所有实

第2章商场促销(3)——策略与简单工厂结合

/*shop.h文件*/ #ifndef _SHOP_ #define _SHOP_ #include<iostream> #include<string> //现金收费抽象类 class Cashsuper { public: virtual double acceptcash(double money); }; //正常收费子类 class cashnormal:public Cashsuper { public: virtual double acceptcash(doubl

大话设计模式C++实现一:简单工厂模式

#include <iostream> #include <cstdlib> using namespace std; class Operation { protected: double numberA; double numberB; public: double getA() { return numberA; } double getB() { return numberB; } void setA(double number) { numberA = number; }

易学设计模式看书笔记(2) - 简单工厂模式

本文摘自易学设计模式一书 一.简单工厂模式 1.动物管理系统的例子 public interface Animal{ public void eat(); } public class Tiger implements Animal { public void eat(){ sysout.out.println("老虎会吃"); }; public void run(){ sysout.out.println("老虎会跑"); }; } public class D

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

结合简单示例和UML图,讲解工厂模式简单原理. 一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!",坐上Bmw后他说"开宝马车!",坐上 Audi后他说"开奥迪车!".你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!幸运的是这种有

设计模式笔记:状态模式&amp;策略模式

这几天一直在忙期末考和实训,写笔记的时间也没有多少,不说废话了: 这文主要写两种模式:状态跟策略,主要是因为他们的类图一样,并且比较简单,写在同一篇文章里面容易甄别 状态模式:允许对象在内部状态改变时改变他的行为,对象看起来好像修改了他的类 先保留概念的意思,在平常的编程中,如果需要不同的状态,很一般的做法是在你要操作的类里面定义不同的常量代表不同的状态,然后if-else依据不同的状态有不同的实现: 1.你可以想象大量的if-else语句造成的低可读性和低效率 2.其次是你修改这个类的时候很麻

设计模式-行为型模式-策略模式

策略模式 在实际工作中我用到了策略模式,但为什么要有环境角色呢? 这里我贴上英文对含义的介绍, The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it. 然后看看这种设计模式的组成, 一般的,策略模式