设计模式实例:中介模式实现打赏功能

实现功能:

1.用户A向用户B打赏金币

2.减少用户A的金币,并写入金币明细表

3.增加用户B的金币,并写入金币明细表

4.给用户B发送一个打赏通知

ps:本文中的同事,并非是指该类为同事,而是沿用中介者模式中的称呼.与中介者打交道的各个类.

一.虚拟同事类:

/**
 * Class Colleague
 */
abstract class Colleague
{
    protected $mediator;

    public function setMediator(Mediator $mediator)
    {
        $this->mediator = $mediator;
    }
}

  

二.虚拟用户类,继承虚拟同事类

/**
 * Class User
 */
abstract class User extends Colleague
{
    protected $uid;
    protected $money;

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

  

三.创建两个同事类:付款方和收款方

1.付款方

class UserPayer extends User
{
    public function changeMoney($money)
    {
        $this->money -= $money;

        // 写入明细
        $this->mediator->writeMoneyDetail([
            ‘uid‘   => $this->uid,
            ‘money‘ => $money,
            ‘rule‘  => ‘-‘
        ]);

        // 付款给对方
        $this->mediator->payee($money);
    }

    public function getUid()
    {
        return $this->uid;
    }
}

  

2.收款方

class UserPayee extends User
{
    public function changeMoney($money)
    {
        $this->money += $money;

        // 写入明细
        $this->mediator->writeMoneyDetail([
            ‘uid‘   => $this->uid,
            ‘money‘ => $money,
            ‘rule‘  => ‘+‘
        ]);

        $attributes = [
            ‘to_uid‘    => $this->uid,
            ‘from_uid‘  => $this->mediator->getPayerUid(),
            ‘money‘     => $money
        ];
        // 增加通知
        $this->mediator->notify($attributes);
    }
}

  

四.继续创建同事类:通知类

/**
 * 通知类
 * Class Notify
 */
class Notify extends Colleague
{
    public function writeNotify(array $attribute)
    {
        echo "用户{$attribute[‘from_uid‘]}向用户{$attribute[‘to_uid‘]}打赏{$attribute[‘money‘]}个金币<br>";
    }
}

  

五.继续创建同事类:金币明细

/**
 * 金币明细
 * Class MoneyDetial
 */
class MoneyDetial extends Colleague
{
    public function writeToDb(array $attribute)
    {
        echo "UID为{$attribute[‘uid‘]}的用户金币{$attribute[‘rule‘]} {$attribute[‘money‘]}<br>";
    }
}

  

六.中介者类:

/**
 * 中介者类
 * Class Mediator
 */
class Mediator
{
    private $userPayer;
    private $userPayee;
    private $notify;
    private $moneyDetial;

    public function __construct(UserPayer $userPayer,
                                UserPayee $userPayee,
                                Notify $notify,
                                MoneyDetial $moneyDetial)
    {
        $this->userPayer    = $userPayer;
        $this->userPayee    = $userPayee;
        $this->notify       = $notify;
        $this->moneyDetial  = $moneyDetial;
    }

    /**
     * 写入明细
     * @param array $arributes
     */
    public function writeMoneyDetail(array $arributes)
    {
        $this->moneyDetial->writeToDb($arributes);
    }

    /**
     * 收款
     * @param $money
     */
    public function payee($money)
    {
        $this->userPayee->changeMoney($money);
    }

    /**
     * 写入通知
     * @param array $attribute
     */
    public function notify(array $attribute)
    {
        $this->notify->writeNotify($attribute);
    }

    /**
     * 获得付款方UID
     * @return mixed
     */
    public function getPayerUid()
    {
        return $this->userPayer->getUid();
    }
}

  

七.具体调用

// 创建各个同事类
$userPayer      = new UserPayer(1, 100);
$userPayee      = new UserPayee(2, 200);
$notify         = new Notify();
$moneyDetial    = new MoneyDetial();

// 创建中介者
$mediator = new Mediator($userPayer, $userPayee, $notify, $moneyDetial);

// 为每个同时类设置中介者
$userPayer->setMediator($mediator);
$userPayee->setMediator($mediator);
$notify->setMediator($mediator);
$moneyDetial->setMediator($mediator);

// 打赏
$userPayer->changeMoney(10);

  

八.输出结果:

UID为1的用户金币- 10
UID为2的用户金币+ 10
用户1向用户2打赏10个金币

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

时间: 2024-08-06 17:05:08

设计模式实例:中介模式实现打赏功能的相关文章

php中的设计模式之--中介模式

<?php /* 中介者模式是一种行为型模式,它包装了一系列对象相互作用的方式, 使得这些对象不必相互明显作用,从而使它们可以松散偶合.当某些对象之间的作用发生改变时, 不会立即影响其他的一些对象之间的作用,保证这些作用可以彼此独立的变化. 定义一个中介对象来封装系列对象之间的交互.中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互. 主要角色 ? 中介者(Mediator)角色:定义了对象间相互作用的接口(房产中介) ? 具体中介者(ConcreteMe

设计模式之中介模式

参考博文:https://www.cnblogs.com/chenssy/p/3348520.html 2019-06-24  11:39:45 中介模式:处理对象之间多对多的复杂关系. 中介模式成员:抽象成员.具体成员.抽象中介者.具体中介者. 成员:成员含有中介者的抽象引用,通过中介者对其他对象进行操作. 中介者: 中介者含有所有成员的引用,通过这些引用操作成员. 基本代码:参考博文. 原文地址:https://www.cnblogs.com/youzoulalala/p/11076286.

说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现

返回目录 为何要设计多功能消息组件 之前写过一篇装饰器模式的文章,感觉不够深入,这次的例子是实现项目中遇到的,所以把它拿出来,再写写,之前也写过消息组件的文章,主要采用了策略模式实现的,即每个项目可以通过配置进行一种消息的订制,如,你可以订制email,sms,rtx,qq等,但不能同时采用多种机制完成消息的发送,这在一些情况下是没有问题的,但有时,我们也需要同时为客户提供多种消息的推送,这在目前还是挺现时的,如在用户下单后,同时为它发email 和短信进行通过,并对每个订单的过程进行跟踪并通知

设计模式之中介者模式(Mediator)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

设计模式之中介者模式20170731

行为型设计模式之中介者模式: 一.含义 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 同事角色与其他同时角色通信的时候,一定要通过中介者角色(中介者封装了各个同事类之间的逻辑关系) 二.代码说明 1.主要有两个角色 1)中介者角色 通过协调各同事角色实现协作行为,因此它必须依赖于各个同事角色. 2)同事角色 每一个同事角色都知道中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作. 每个同事类的行为分

设计模式(中介者模式-对象去耦)

声明:本系列文章内容摘自<iOS设计模式> 中介者模式 用一个对象来封装一系列对象的交互方式.中介者使个对象不需要显式地相互调用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 何时使用中介者模式 1.对象间的交互虽定义明确然而非常复杂,导致椅子对象彼此相互依赖而且难以理解: 2.因为对象引用了许多其他对象并与其通信,导致对象难以复用: 3.想要制定一个分布在多个对象中的逻辑或行为,又不想生成太多子类. 举个例子 有三个视图,我们可能需要两两之间进行跳转,类比于公司内同时每两个人都有可能

【一起学设计模式】中介者模式+观察者模式+备忘录模式实战:(二)提交个订单我到底经历了什么鬼?

前言 再多的话就不说了,这个是接着上一讲: [一起学设计模式]状态模式+装饰器模式+简单工厂模式实战:(一)提交个订单我到底经历了什么鬼? 一起的,一些多余的赘述请先看这个篇文章. 业务场景 一图流,还是上一篇文章中一样的图,接下来我们就梳理下总结模式.观察者模式.备忘录模式的应用: 订单中心: 1.订单中心创建订单 2.订单状态流转(状态模式) 3.记录操作日志(装饰器模式+简单工厂模式) 4.订单中心通知 库存中心更新库存 调度中心: 1.库存中心更新本地库存(使用命令模式+模板方法模式+工

设计模式之: 中介者模式

一.前言 平常我们写一个聊天软件,如果我们只是各个客户端之间连接聊天,那估计我们会写的想哭,那如果我们用服务器作为中间媒介,通过服务器来完成转发,群聊等客户端之间的连接,那样我们就可以最大程度的为各个客户端之间解耦,把它们之间的通信方法抽出来单独实现, 如图1就是不使用中介媒体的时候的结构图: 如图2就是使用我们所说的服务器作为中间媒介的情况的结构图: 二.中介模式 图二就是我们所说的中介模式! 在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装

【设计模式】——中介者模式

中介者模式(Mediator),用一个中介者对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互. Colleague叫做抽象同事类,而ConcreteColleague是具体同事类,每个具体同事只知道自己的行为,而不了解其他同事类的情况,但它们却都认识中介者对象,Mediator是抽象中介者,定义了同事对象到中介者对象的接口,ConcreteMediator是具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接