首页 > 编程语言 >C++ 设计模式之中介者模式

C++ 设计模式之中介者模式

时间:2023-07-07 13:56:36浏览次数:36  
标签:Colleague std string Mediator send 中介 C++ msg 设计模式

设计模式之中介者模式

中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。该模式很好理解,其UML图如下:

 Mediator中每个交互者的引用,在Mediator内部封装了各种类之间的交互。至于那个类和那个类交合则有具体的需求来决定。示例代码如下:

 1 // MediatorModel.h文件
 2 #pragma once
 3 #include <string>
 4 #include <iostream>
 5 
 6 class Colleague;
 7 
 8 class Mediator
 9 {
10 public:
11     virtual void send(std::string  msg, Colleague * p) = 0;
12 };
13 
14 class Colleague
15 {
16 protected:
17     Mediator * m_mediator;
18 public:
19     Colleague(Mediator * p)
20     {
21         m_mediator = p;
22     }
23     virtual void send(std::string msg) = 0;
24     virtual void notify(std::string msg) = 0;
25 };
26 
27 class ConcreteColleague_0 : public Colleague
28 {
29 public:
30     ConcreteColleague_0(Mediator * p) : Colleague(p) {}
31     void send(std::string msg)
32     {
33         m_mediator->send(msg, this);
34     }
35     void notify(std::string msg)
36     {
37         std::cout << "Colleague_0 收到了消息:" << msg << std::endl;
38     }
39 };
40 
41 class ConcreteColleague_1 : public Colleague
42 {
43 public:
44     ConcreteColleague_1(Mediator * p) : Colleague(p) {}
45     void send(std::string msg)
46     {
47         m_mediator->send(msg, this);
48     }
49     void notify(std::string msg)
50     {
51         std::cout << "Colleague_1 收到了消息:" << msg << std::endl;
52     }
53 };
54 
55 class ConcreteMediator : public Mediator
56 {
57 private:
58     // 这里也可以是一个列表
59     Colleague * m_p1;
60     Colleague * m_p2;
61 public:
62     void addColleague(Colleague * p1, Colleague * p2)
63     {
64         m_p1 = p1;
65         m_p2 = p2;
66     }
67     void send(std::string msg, Colleague * p)
68     {
69         // 这里接受来自一个同事发过来的消息,具体应该给谁要根据需求来
70         // 这里知识一个很简单的应用。比如该类总可以是有两个队列。
71         // 一个队列是客户,一个队列是客服
72         if (p == m_p1)
73             m_p2->notify(msg);
74         else
75             m_p1->notify(msg);    
76     }
77 };

测试代码如下:

 1 #include <iostream>
 2 #include "MediatorModel.h"
 3 
 4 int main()
 5 {
 6     using namespace std;
 7     // 中介者模式
 8     ConcreteMediator * p = new ConcreteMediator();
 9     Colleague * pCol1 = new ConcreteColleague_0(p);
10     Colleague * pCol2 = new ConcreteColleague_1(p);
11     p->addColleague(pCol1, pCol2);
12     pCol1->send("你下班了吗?");
13     pCol2->send("没呢,你呢?");
14     delete pCol1;
15     delete pCol2;
16     delete p;
17 
18     getchar();
19     return 0;
20 }

测试结果如下图:

  Mediator的出现减少了各个Colleague的耦合,使得可以读来地改变和复用各个Colleague类和Mediator。由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。等于说使把交互的复杂性变为了中介的复杂性。

标签:Colleague,std,string,Mediator,send,中介,C++,msg,设计模式
From: https://www.cnblogs.com/ybqjymy/p/17534759.html

相关文章

  • C++ 设计模式之享元模式
    设计模式之享元模式享元模式,运用共享技术有效地支持大量细粒度的对象。面向对象技术可以很好地解决一些灵活性或扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。享元模式正式为了解决这依赖问题而诞生的。......
  • C++ 设计模式之解释器模式
    设计模式之解释器模式解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式解决的问题是,如果一种特定类型的问题发生的频率足够高,那么可能就只得将该问题的各个示例表述为一个简单语言中的句子。这样就可以构建......
  • C/C++数据结构与算法课程设计[2023-07-06]
    C/C++数据结构与算法课程设计[2023-07-06]数据结构与算法课程设计一、课程设计的目的、要求和任务 本课程设计是为了配合《数据结构与算法》课程的开设,通过设计完整的程序,使学生掌握数据结构的应用、算法的编写等基本方法。1.课程的目的(1)使学生进一步理解和掌握课堂上所学......
  • C++ 设计模式之简单工厂模式
    设计模式之简单工厂模式(C++)简单工厂模式,主要用于创建对象。新添加类时,不会影响以前的系统代码。核心思想是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。优点:适用于不同情况创建不同的类时。缺点:客户端必须要知道基类和工厂类,耦合性差......
  • C++ 设计模式之组合模式
    设计模式之组合模式组合模式,将对象组合成属性结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。其UML图如下:一个组织有很多子组织,而无论子组织是单独一个部门或是一个分组织。该组织都希望把它们当成一样的子组织来管理。......
  • C++ 设计模式之单例模式
    设计模式之单例模式保证一个类仅有一个实例,并提供一个访问他的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且可以提供一个访问该实例......
  • C++学生健康信息收集系统[2023-07-06]
    C++学生健康信息收集系统[2023-07-06]学生健康信息收集系统简介一、 问题描述为了应对新型冠状病毒疫情,学校需要开发一个能够每天收集全校学生健康信息的系统,便于学校管理。不同学院以及学校的管理员,需要能方便地查看和导出健康状况异常的学生列表,并能对各类信息进行查看和统计......
  • C/C++学生通讯录管理系统[2023-07-06]
    C/C++学生通讯录管理系统[2023-07-06]一、设计要求1、题目利用C++语言实现一个学生通讯录管理系统,系统中需要实现的功能如下:(1)添加学生信息:向通讯录中添加新人,信息包括(学生姓名、性别、年龄、联系电话、家庭住址等),最多记录100人。(2)显示学生信息:显示通讯录中所有学生信息。(3)删......
  • C++ 设计模式之桥接模式
    设计模式之桥接模式桥接模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。这里说的实现分离,并不是说然抽象类与派生类分离,这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象。其UML图如下: 结合上图理解一下其定义。抽象部分指的是Abstraction......
  • C/C++订餐管理系统[2023-07-07]
    C/C++订餐管理系统[2023-07-07]1、订餐管理系统要求实现饭店的订餐信息管理,包括菜单管理、订单管理、统计分析。实现菜单信息(菜号、菜名、价格、成本)的增删改查;实现订单管理(订单号、就餐人数、下单时间、订单总价、订单包含的所有菜品(菜号、数量))。系统功能包括以下方面:A、菜......