首页 > 其他分享 >设计模式-中介者模式

设计模式-中介者模式

时间:2023-09-10 14:44:37浏览次数:47  
标签:Colleague string void send 模式 中介 message 设计模式 struColleague

中介者模式

定义

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

UML 类图

使用场景

+ 一般用于一组对象以定义良好但复杂的方式进行通信的场景,比如窗体的 Form 或者 web 页面 asp
+ 想定制一个分布在多个类中的行为,但是又不想生成太多的子类的场合。

代码

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

#include <iostream>
#include <string>
using namespace std;

class Colleague;
class Mediator
{
public:
    virtual void send(string message, Colleague* colleague) = 0;
};

class Colleague
{
public:
    Colleague(Mediator *p_mediator): m_pMediator(p_mediator){}
    virtual void send(string message) = 0;
protected:
    Mediator* m_pMediator;
};

class ConcreteColleague1 : public Colleague
{
public:
    ConcreteColleague1(Mediator* p_mediator):Colleague(p_mediator){}
    virtual void send(string message){
        m_pMediator->send(message, this);
    }
    void notify(string messsage){
        cout << "Colleague 1 has received message: " << messsage << endl;
    }
};

class ConcreteColleague2 : public Colleague
{
public:
    ConcreteColleague2(Mediator* p_mediator):Colleague(p_mediator){}
    virtual void send(string message){
        m_pMediator->send(message, this);
    }
    void notify(string messsage){
        cout << "Colleague 2 has received message: " << messsage << endl;
    }
};

class ConcreteMediator : public Mediator
{
public:
    virtual void send(string message, Colleague* p_struColleague){
        ConcreteColleague1* p_struConcreteColleague1 = dynamic_cast<ConcreteColleague1*>(p_struColleague);
        if(p_struConcreteColleague1){
            cout << "The message from Colleague1: " << message << endl;
            if(m_pstruColleague_2){
                m_pstruColleague_2->notify(message);
            }
        }
        else{
            cout << "The message from Colleague2: " << message << endl;
            if(m_pstruColleague_1){
                m_pstruColleague_1->notify(message);
            }
        }
    }
    void setColleague1(Colleague* p_struColleague){
        m_pstruColleague_1 = dynamic_cast<ConcreteColleague1*>(p_struColleague);
    }
    void setColleague2(Colleague* p_struColleague){
        m_pstruColleague_2 = dynamic_cast<ConcreteColleague2*>(p_struColleague);
    }
private:
    ConcreteColleague1* m_pstruColleague_1;
    ConcreteColleague2* m_pstruColleague_2;
};

int main() {
    Mediator* p_struMediator = new ConcreteMediator();
    Colleague* p_struColleague_1 = new ConcreteColleague1(p_struMediator);
    Colleague* p_struColleague_2 = new ConcreteColleague2(p_struMediator);
    
    ConcreteMediator* p_struConcreteMediator = dynamic_cast<ConcreteMediator*>(p_struMediator);
    p_struConcreteMediator->setColleague1(p_struColleague_1);
    p_struConcreteMediator->setColleague2(p_struColleague_2);

    string message1 = "Have you eat morning?";
    p_struColleague_1->send(message1);

    string message2 = "No, I haven't!";
    p_struColleague_2->send(message2);
    
    return 0;
}

优缺点

优点

+ 减少了系统的耦合性,使得子类之间的交互转换成中介类的逻辑,使逻辑集中化

缺点

+ 当系统出现多对多的对象群时,中介者模式的逻辑将会非常复杂。

标签:Colleague,string,void,send,模式,中介,message,设计模式,struColleague
From: https://www.cnblogs.com/wanghao-boke/p/17691202.html

相关文章

  • 趣解设计模式之《办理入职这么难吗?》
    〇、小故事小王大学毕业,经过大学期间的刻苦学习,终于成功的面试上了一家公司。按照约定的时间,小王兴高采烈的来到公司前台去办理入职手续。“您好,我是来办理入职手续的”小王对前台妹妹说,前台妹妹看都没看他一眼,顺手递给了他一个单子,带着一丝不耐烦的语气跟他说,“照着单子做就行”......
  • M6000-S路由器和89E交换机无法进入config模式, 是什么原因, 如何解决?
    M6000-S路由器和89E交换机使用命令configterminal,无法进入config模式,报错ZXR10#cont%Error140357:Simultaneousconfigsnotallowed.Lockedfromvty0(192.168.6.215). 这是因为未开启多用户配置,只有一个用户能够进入config模式,这时需要先查看当前已在线的......
  • Docker的网络模式简介
    1)docker网络常用命令查看docker的网络模式dockernetworklsdocker网络常用命令参数connect #连接容器到网络create#创建网络disconnect#断开容器与网络的连接inspect#显示一个或多个网络的详细信息ls#列出所有网络prune#删除所有未使用的......
  • 【浏览器按F12打不开开发者工具(兼容模式打开处)】
    操作首先选择浏览器的三个点样子的图标,不同浏览器位置可能不同,这里以edge为例接下来在更多工具中寻找到开发人员工具,即可顺利的打开网页的源码补充有时页面需要使用兼容模式打开,其选项也在此处,选择在IE模式下打开即可......
  • Go 中几种常见的编程模式
    模式可以理解成最佳实践,或者是约定俗成的规范或套路,熟悉一些常见模式可以方便理解项目代码。本文是参考左耳朵耗子的专栏文章做的笔记,另外也缅怀一下耗子叔。slice切片的数据共享与扩容迁移切片的数据共享切片就像是在数组上开的窗口,透过切片窗口可以看到和修改底层数组。这......
  • Nomad系列-Nomad网络模式
    系列文章Nomad系列文章概述Nomad的网络和Docker的也有很大不同,和K8s的有很大不同.另外,Nomad不同版本(Nomad1.3版本前后)或是否集成Consul及CNI等不同组件也会导致网络模式各不相同.本文详细梳理一下Nomad的主要几种网络模式在Nomad1.3发布之前,它自身......
  • 适配器设计模式解决接口冲突
    title:适配器设计模式解决接口冲突index_img:https://tuchuangs.com/imgs/2023/08/04/f341f43b9362c8a1.pngtags:-JavaSE-接口categories:-JavaSEhide:falseexcerpt:适配器设计模式解决接口冲突问题描述当一个接口中抽象方法过多,但是我只要使用其中一部......
  • ACM模式下快速读取二维数组
    ACM二维数组的读取输入550100001110000000111000010读取Scannerin=newScanner(System.in);introw=in.nextInt();intcol=in.nextInt();int[][]arr=newint[row][col];for(inti=0;i<row;i++){for(intj=0;j<col......
  • builder模式
    packagestudy;importlombok.Data;@DatapublicclassStudent{Integerage;Stringname;Stringaddress;publicStudent(){}publicStudent(Builderbuilder){this.name=builder.name;}publicstaticBuild......
  • 原型模式和深拷贝,浅拷贝
    原型模式案例引入克隆羊问题有一只羊,姓名为tom,年龄为1,颜色为白色,编写程序创建和tom羊属性完全相同的羊。传统方式解决代码实现publicclassSheep{privateStringname;privateintage;privateStringcolor;publicSheep(){}publicShe......