行为型 中介者模式

简介: 行为型 中介者模式

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

中介者模式

概要分析

两个类之间不能直接联系,而是通过第三方之间通信,从而将两个类之间的关系解耦

例如:将具体的两个同事之间的消息进行转发,从而使得两个同事之间避免了直接联系

样例demo:

如:租房中介:实现了房东和租户之间消息互通。

/***********************************************************************************************
中介者模式:
    思想:两个类之间不能直接联系,而是通过第三方之间通信,从而将两个类之间的关系解耦
          将具体的两个同事之间的消息进行转发,从而使得两个同事之间避免了直接联系
    1.创建抽象的中介及同事类;中介持有同事类的指针,同事持有中介指针
    2.创建中介,创建同事,在创建具体的同事时,将中介通过基类构造函数传递,使得同事认识中介,然后中介认识具体的同事
    3.同事1去发送消息,在内部封装通过中介去发送消息,将本对象及消息进行传递,将消息发送到中介,然后中介进行判断将消息发送给谁
    具体消息转发逻辑在中介内部完成,调用另一个同事的接收消息的函数,从而得到别的同事发给自己的消息
************************************************************************************************/
#include <iostream>
#include <string>
using namespace std;
class Colleague;
class Mediator   //抽象中介者类
{
public:
    virtual void Send(string message, Colleague* col) = 0;
};
class Colleague
{//同事类
protected:
    Mediator* mediator;
public:
    Colleague(Mediator* temp)
    {
        mediator = temp;
    }
};
class Colleague1 : public Colleague   //同事一
{
public:
    Colleague1(Mediator* media) : Colleague(media){}
    void Send(string strMessage)
    {
        mediator->Send(strMessage, this);
    }
    void Notify(string strMessage)
    {
        cout << "同事一获得了消息 " << strMessage << endl;
    }
};
class Colleague2 : public Colleague   //同事二
{
public:
    Colleague2(Mediator* media) : Colleague(media){}
    void Send(string strMessage)
    {
        mediator->Send(strMessage, this);
    }
    void Notify(string strMessage)
    {
        cout << "同事二获得了消息 " << strMessage << endl;
    }
};
class ConcreteMediator : public Mediator   //具体中介者类
{
public:
    Colleague1 * col1;
    Colleague2 * col2;
    virtual void Send(string message, Colleague* col)
    {
        if (col == col1) //就是说如果传来的第1个同时发送的消息,那么我就调同事2的函数
            col2->Notify(message);
        else             //就是说如果传来的第2个同时发送的消息,那么我就调同事1的函数
            col1->Notify(message);
    }
};
int main()
{
    ConcreteMediator * m = new ConcreteMediator();//创建具体的中介者
    /*中介与同事之间互相认识*/
    Colleague1* col1 = new Colleague1(m);
    Colleague2* col2 = new Colleague2(m);
    m->col1 = col1;
    m->col2 = col2;
    /*同事1发送消息,实际上是将(消息+本对象)传递给中介,让中介去判断发送给谁
    中介者的判断逻辑来决定将消息发送给谁,将消息传到第二个同事那里*/
    col1->Send("吃饭了吗?");
    col2->Send("还没吃,你请吗?");
    // system("pause");
    return 0;
}
目录
相关文章
|
8月前
|
JavaScript 前端开发
|
关系型数据库 MySQL 数据库
java.sql.SQLException: Connections could not be acquired from the underlying database!
java.sql.SQLException: Connections could not be acquired from the underlying database!
792 0
|
存储 Linux Shell
【Linux】15. 文件系统与软硬链接
【Linux】15. 文件系统与软硬链接
128 6
|
Rust 前端开发 JavaScript
探索前端技术的未来发展
【2月更文挑战第4天】随着科技的不断进步,前端技术作为Web应用开发的重要组成部分,也在不断演变和发展。本文将探索前端技术的未来发展趋势,包括新兴技术、用户体验优化和跨平台应用等方面,为读者提供对未来前端技术发展的全面了解。
|
人工智能 文字识别 网络协议
品类超全的免费 API 大全整理
品类超全的免费 API 大全整理
442 0
|
开发工具 数据安全/隐私保护 git
远程 Git 仓库(提交代码)| 学习笔记
快速学习 远程 Git 仓库(提交代码)
196 0
远程 Git 仓库(提交代码)| 学习笔记
|
Java Serverless Maven
玩转阿里云函数计算(一)----Java Http 触发器极速迁移传统 Spring 应用
前言 阿里云函数计算 Function Compute(FC),旨在帮助用户采用弹性伸缩、动态分配资源的方式,来执行业务函数。让用户无需购买部署服务器,无需考虑业务负载,就能快速搭建可处理高并发的后台服务。
23195 1
|
应用服务中间件 nginx Docker
Docker 常用命令总结
列出镜像列表 docker images 获取新的镜像 docker pull centos:7.0 查找镜像 docker search httpd 更新镜像 docker commit -m="提交的信息" -a="作者" e218edb10...
2326 0