大话设计模式-中介者模式

中介者模式(Mediator)

一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

使用

中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。

  • 优点:
    • 首先是 Mediator (中介者)的出现减少了各个 Colleague (对象)的耦合,使得可以独立地改变和复用各个 Colleague 类和 Mediator。
    • 其次,由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。
  • 缺点:由于 ConcreteMediator 控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个 ConcreteColleague 都复杂。

结构图

在这里插入图片描述

example

联合国安理会作为中介者的角色,负责各个国家之间的信息传递。

#include <iostream>
#include <bits/stdc++.h>

using namespace std;
class UnitedNations;
// 抽象国家
class Nations
{
protected:
    UnitedNations *un;

public:
    Nations(UnitedNations *u) : un(u) {}
    virtual void send(Nations *to,string message) = 0;
    virtual void notify(Nations *from,string messages) = 0;
};

// 抽象联合国类 其下有各种组织
class UnitedNations
{
public:
    virtual void send(Nations *from,Nations *to,string message) = 0;
};

class China : public Nations
{
public:
    China(UnitedNations *u) : Nations(u) {}
    virtual void send(Nations *to,string message)
    {
        un->send(this,to,message);
    }
    virtual void notify(Nations *from,string messages)
    {
        cout << "China收到来自 " << typeid(*from).name() << " 的消息:" << messages << endl;
    }
};

class Russia : public Nations
{
public:
    Russia(UnitedNations *u) : Nations(u) {}
    virtual void send(Nations *to,string message)
    {
        un->send(this,to,message);
    }
    virtual void notify(Nations *from,string messages)
    {
        cout << "Russia收到来自 " << typeid(*from).name() << " 的消息:" << messages << endl;
    }
};
// 联合国安理会
class UnitedNationsSecurityCouncil : public UnitedNations
{
    Nations *c1;
    Nations *c2;
public:
    // UnitedNationsSecurityCouncil(Nations *c1,Nations *c2):c1(c1),c2(c2){}
    void setN1(Nations *c){ c1 = c;}
    void setN2(Nations *c){ c2 = c;}
    virtual void send(Nations *from,Nations *to,string message)
    {
        to->notify(from,message);
    }
};
int main()
{
    UnitedNations *un = new UnitedNationsSecurityCouncil();
    Nations *c = new China(un);
    Nations *r = new Russia(un);
    c->send(r,"hello");
    r->send(c,"hi");
    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值