建造模式 + 外观模式示例:实现扣除用户金币及写入用户明细

实现功能:

扣除用户金币及写入金币明细,这是同一个行为,使用外观模式

金币明细需要多个参数来保证对象的完整,参数过多,所以使用建造模式

一.用户明细类

class MoneyDetail
{
    const   MONEY_PAY       = 1;    // 充值获得
    const   MONEY_EXCHANGE  = 2;    // 兑换

    private $type;
    private $quantity;
    private $desc;
    private $time;

    public function __construct(MoneyDetailBuilder $builder)
    {
        $this->type         = $builder->getType();
        $this->quantity     = $builder->getQuantity();
        $this->desc         = $builder->getDesc();
        $this->time         = $builder->getTime();
    }

    /**
     * 写入数据库
     */
    public function writeDb()
    {
        echo "[{$this->type}|{$this->quantity}|{$this->desc}|{$this->time}]数据已写入数据库";
    }
}

  

二.用户明细建造者类

class MoneyDetailBuilder
{
    private $type;
    private $quantity;
    private $desc;
    private $time;

    /**
     * @return mixed
     */
    public function getType()
    {
        return $this->type;
    }

    /**
     * @param $type
     * @return $this
     */
    public function setType($type)
    {
        $this->type = $type;
        return $this;
    }

    /**
     * @return mixed
     */
    public function getQuantity()
    {
        return $this->quantity;
    }

    /**
     * @param $quantity
     * @return $this
     */
    public function setQuantity($quantity)
    {
        $this->quantity = $quantity;
        return $this;
    }

    /**
     * @return mixed
     */
    public function getDesc()
    {
        return $this->desc;
    }

    /**
     * @param $desc
     * @return $this
     */
    public function setDesc($desc)
    {
        $this->desc = $desc;
        return $this;
    }

    /**
     * @return mixed
     */
    public function getTime()
    {
        return $this->time;
    }

    /**
     * @param $time
     * @return $this
     */
    public function setTime($time)
    {
        $this->time = $time;
        return $this;
    }

    public function moneyDetail()
    {
        return new MoneyDetail($this);
    }
}

  

三.用户类:

class User
{
    private $money;

    public function __construct()
    {
        $this->money = 500;
    }

    public function reduceMoney($quantity)
    {
        $this->money -= $quantity;
        echo ‘用户扣除金币成功‘;
    }

    public function getMoney()
    {
        return $this->money;
    }
}

  

四.扣除用户金币外观类

class UserFacade
{
    private $user;
    private $moneyDetailBuilder;

    public function __construct(User $user, MoneyDetailBuilder $moneyDetailBuilder)
    {
        $this->user                 = $user;
        $this->moneyDetailBuilder   = $moneyDetailBuilder;
    }

    public function reduceMoney($quantity)
    {
        $this->user->reduceMoney($quantity);
        $this->moneyDetailBuilder->setDesc($this->moneyDetailBuilder->getDesc() . "扣除{$quantity}金币;当前金币{$this->user->getMoney()}");
        $this->moneyDetailBuilder->moneyDetail()->writeDb();
    }
}

  

五.调用

// 建造金币明细类
$moneyDetailBuilder = new MoneyDetailBuilder();
$moneyDetailBuilder->setType(MoneyDetail::MONEY_EXCHANGE)
    ->setQuantity(100)
    ->setTime(time())
    ->setDesc(‘兑换奖品,‘);

// 扣除金币
$user = new User();
$userFacade = new UserFacade($user, $moneyDetailBuilder);
$userFacade->reduceMoney(100);

  

原文地址:https://www.cnblogs.com/itfenqing/p/8728938.html

时间: 2024-10-13 06:55:20

建造模式 + 外观模式示例:实现扣除用户金币及写入用户明细的相关文章

门面模式/外观模式

原文链接:http://www.tutorialspoint.com/design_pattern/facade_pattern.htm Facade Pattern(门面模式/外观模式) 隐藏了系统的复杂性,为客户端访问系统提供了一个接口.Facade Pattern 属于结构型模式的一种,通过添加一个接口来隐藏现有系统的复杂性. Facade Pattern 涉及到一个类,这个类代理调用了现有系统的类的一些方法,从而为客户端提供了简化的方法来访问系统. 实现 我们将会创建一个 Shape 接

java设计模式--结构型模式--外观模式

1 外观模式 2 概述 3 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 4 5 6 适用性 7 1.当你要为一个复杂子系统提供一个简单接口时.子系统往往因为不断演化而变得越来越 8 复杂.大多数模式使用时都会产生更多更小的类.这使得子系统更具可重用性,也更容 9 易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难. 10 Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需

第12章 结构型模式—外观模式

1. 外观(门面)模式(Facade Pattern)的定义 (1)为子系统中的一组接口提供一个一致的界面,Façade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. ①这里说的界面是指从一个组件外部来看这个组件,能够看到什么,也就是外观.如从一个类外部看这个类,那么这个类的public方法或接口就是他的外观. ②这里所说的“接口”是指外部和内部交互的一个通道(方法),可以是类的方法,也可以是interface的方法. (2)外观模式的结构和说明 ①Façade:定义子系统的多个模

11 结构型模式-----外观模式

模式动机(Facade Pattern):在设计一个复杂系统时,一般会将其分解为若干个具有特定功能的子系统以便于分析设计,这样的话就会导致数量众多的子系统接口出现,使得与调用者的交互变得复杂了.解决办法是在所有子系统的上一层提供一个外观类(Facade),其负责对所有子系统的统一调用,客户只需和外观类交互即可. 模式结构图: 模式代码: bt_外观模式.h: 1 #ifndef FP_H 2 #define FP_H 3 #include <iostream> 4 5 /* 6 定义子系统Su

设计模式--结构型模式--外观模式

医院的例子: 现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其“分而治之”,把一个系统划分为几个较小的子系统.如果把医院作为一个子 系统,按照部门职能,这个系统可以划分为挂号.门诊.划价.化验.收费.取药等.看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的 各个类打交道一样,不是一件容易的事情. 首先病人必须先挂号,然后门诊.如果医生要求化验,病人必须首先划价,然后缴费,才可以到化验部门做化验.化验后再回到门诊室. 上图描述的是病人在医院里的体验,图中的

【编程思想】【设计模式】【结构模式Structural】门面模式/外观模式Facade

Python版 https://github.com/faif/python-patterns/blob/master/structural/facade.py #!/usr/bin/env python # -*- coding: utf-8 -*- """ *What is this pattern about? The Facade pattern is a way to provide a simpler unified interface to a more com

2 结构型模式之 - 外观模式

外观模式的介绍:外观模式在开发运用中的频率非常高,尤其是现阶段各种第三方SDK充斥在我们的周边,而这些SDK很大概率会使用外观模式,通过一个外观类使得整个系统的接口只有一个统一的高层接口,这样就能够降低用户使用的复杂度,也对用户屏蔽了很多实现细节,当然 ,在我们的开发过程中,外观模式也是我们封装API的常用手段,例如网络模块,ImageLoader模块等.可能你已经在开发中运用过无数次外观模式,只是没有理论层面上认识它,本章我们就从理论与实践相结合的方式来理解外观模式 外观模式的定义: 要求一个

Java设计模式(五)外观模式 桥梁模式

(九)外观模式 外观模式为子系统提供一个接口,便于使用.解决了类与类之间关系的,外观模式将类之间的关系放在一个 Facade 类中,降低了类类之间的耦合度,该模式不涉及接口. class CPU { public void startup(){ System.out.println("cpu start"); } public void shutdown(){ System.out.println("cpu stop"); } } class Memory { pu

设计模式(十二): 外观模式

外观模式 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用. 介绍 意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口. 何时使用: 1.客户