c++ 行为型模式-中介者(Mediator)

1) 意图

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

2) 结构

其中:

  1. Mediator定义一个接口用于各同事对象的通信
  2. ConcreteMediator 通过协调各个Colleague 类对象实现协助行为
  3. Colleague 知道它的中介者对象,每个Colleague 类对象在需要与其他Colleague 通信的时候与它的中介者通信

3) 适用性

  1. 一组对象通信方式复杂,产生的相互依赖关系结构混乱且难以理解
  2. 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象
  3. 想定制一个分布在多个类中的行为,而又不想生成太多的子类

4) 举例

 1 #include <iostream>
 2 //ConcreteColleague1和ConcreteColleague2互相发消息,让对方通知出去,为减小其耦合,通过中介者Mediator实现这一功能
 3 class Mediator;
 4 class Colleague
 5 {
 6 public:
 7     Colleague(Mediator* pMediator):m_pMediator(pMediator){}
 8     virtual ~Colleague() {}
 9     virtual void send(std::string msg) = 0;
10 protected:
11     Mediator* m_pMediator;
12 };
13 class ConcreteColleague1:public Colleague
14 {
15 public:
16     ConcreteColleague1(Mediator* pMediator) :Colleague(pMediator) {}
17     virtual ~ConcreteColleague1() {}
18     virtual void send(std::string msg);
19     void notify(std::string msg)
20     {
21         std::cout <<" ConcreteColleague1 notify "<< msg.c_str() << std::endl;
22     }
23 };
24 class ConcreteColleague2 :public Colleague
25 {
26 public:
27     ConcreteColleague2(Mediator* pMediator) :Colleague(pMediator) {}
28     virtual ~ConcreteColleague2() {}
29     virtual void send(std::string msg);
30     void notify(std::string msg)
31     {
32         std::cout <<" ConcreteColleague2 notify "<< msg.c_str() << std::endl;
33     }
34 };
35 class Mediator
36 {
37 public:
38     Mediator() {}
39     virtual ~Mediator() {}
40     virtual void send(std::string msg, Colleague* pColleague) = 0;
41     virtual void setColleague1(Colleague* pColleague) = 0;
42     virtual void setColleague2(Colleague* pColleague) = 0;
43
44 };
45
46 class ConcreteMediator:public Mediator
47 {
48 public:
49     ConcreteMediator() {};
50     virtual ~ConcreteMediator() {}
51     void send(std::string msg, Colleague* pColleague)
52     {
53         ConcreteColleague1* pConcreteColleague1 =
54             dynamic_cast<ConcreteColleague1*>(pColleague);
55         if (pConcreteColleague1)
56         {
57             std::cout << "msg from ConcreteColleague1" << std::endl;
58             m_pColleague2->notify(msg);
59         }
60         else
61         {
62             std::cout << "msg from ConcreteColleague2" << std::endl;
63             m_pColleague1->notify(msg);
64         }
65     }
66     virtual void setColleague1(Colleague* pColleague)
67     {
68         m_pColleague1 = dynamic_cast<ConcreteColleague1*>(pColleague);
69     }
70     virtual void setColleague2(Colleague* pColleague)
71     {
72         m_pColleague2 = dynamic_cast<ConcreteColleague2*>(pColleague);
73     }
74 private:
75     ConcreteColleague1* m_pColleague1;
76     ConcreteColleague2* m_pColleague2;
77 };
78
79 void ConcreteColleague1::send(std::string msg)
80 {
81     m_pMediator->send(msg,this);
82 }
83 void ConcreteColleague2::send(std::string msg)
84 {
85     m_pMediator->send(msg, this);
86 }
87 int main()
88 {
89     Mediator* pMediator = new ConcreteMediator();
90     Colleague* pColleague1 = new ConcreteColleague1(pMediator);
91     Colleague* pColleague2 = new ConcreteColleague2(pMediator);
92     pMediator->setColleague1(pColleague1);
93     pMediator->setColleague2(pColleague2);
94
95     pColleague1->send("hello");
96     pColleague2->send("world");
97     system("pause");
98 }

原文地址:https://www.cnblogs.com/ho966/p/12237843.html

时间: 2024-10-11 20:41:15

c++ 行为型模式-中介者(Mediator)的相关文章

设计模式-行为型模式-中介者模式

中介者要解决的问题 中介者模式(Mediator Pattern)是用来降低多个对象和类之间通信的复杂度.这种模式提供了一个中介类,该类通常用来处理不同类之间的通信.中介者模式符合迪米特原则,即一个类应当尽量减少与其他类的联系. 实例描述 在我们现实生活中就有这样的例子,你如果去租房,你可能会在网站上找一些发布租房的信息,找到对应的房东.为了能够找到性价比高的房子,你可能找好多家,那么你都要和这些房东打交道,留下电话啥的.有时候房子不好出租的情况下,房东还会主动联系你,就有了下面这幅图: 我们可

设计模式(30)-----行为型模式-----中介者设计模式

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行为型模式. 介绍 意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理. 何

第19章 行为型模式—中介者模式

1. 中介者模式(Mediator Pattern)的定义 (1)定义:用一个中介对象来封装一系统对象交互.中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.       ①中介者模式主要用来将同事类之间网状结构变为星状结构,使同事类之间的关系变的清晰一些. ②所有对象只跟中介者对象进行通信,相互之间不再有联系,这样也能够集中控制这些对象的交互关系. (2)中介者模式的结构和说明 ①Mediator: 中介者接口.在里面定义各个同事之间交互需要的方法,可以

java设计模式--行为型模式--中介者模式

怎么理解中介者模式,我姑且用房产中介来理解吧.呵呵 中介者模式: 1 中介者模式 2 概述 3 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 4 5 6 适用性 7 1.一组对象以定义良好但是复杂的方式进行通信.产生的相互依赖关系结构混乱且难以理解. 8 9 2.一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象. 10 11 3.想定制一个分布在多个类中的行为,而又不想生成太多的子类. 12 13

(17):(行为型模式) Mediator 中介者模式

(17):(行为型模式) Mediator 中介者模式,布布扣,bubuko.com

设计模式16:Mediator 中介者模式(行为型模式)

Mediator 中介者模式(行为型模式) 依赖关系的转化 动机(Motivation) 在软件构建过程中,经常出现多个对象互相关联交互的情况,对象之间经常会维持一种复杂的应用关系,如果遇到一些需求的更改,这种直接的引用将面临不断的变化. 在这种情况下,我们可以使用一个“中介对象”来管理对象间的关联关系,避免相互的对象之间的紧耦合引用关系,从而更好地抵御变化. 意图(Intent) 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变它们

设计模式(行为型)之中介者模式(Mediator Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之职责链模式(Chain of Responsibility Pattern)>http://blog.csdn.net/yanbober/article/details/45531395 概述 如果对象之间的联系呈现为网状结构,存在大量的多对多联系,在网状结

行为型模式之中介者模式

概述 如果在一个系统中对象之间存在多对多的相互关系,可以将对象之间的一些交互行为从各个对象中分离出来,并集中封装在一个中介者对象中,并由该中介者进行统一协调,这样对象之间多对多的复杂关系就转化为相对简单的一对多关系.通过引入中介者来简化对象之间的复杂交互,中介者模式是“迪米特法则”的一个典型应用. 定义 中介者模式(Mediator Pattern):用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.中介者模式

9 行为型模式之 - 中介者模式

中介者模式的介绍:中介者模式是行为型模式这一,在日常生活中,比如两口子吵架,孩子和双方的父母会劝架,孩子和双方的父母就称有中介者的意思,就是"和事佬",也就是说调解两个起争端的人.而中介绍者模式比这个例子要复杂的多,上面的例子只是涉及到2个人的,中介者模式要涉及的对象是多个.多个对象之间的交互关系,是很复杂的,是网状的关系,中介者就是要把这种多对多的关系转化为一对多的关系,就是转化为星状结构,如下图 网状关系 星状关系 中介模式的定义:中介者模式包装了一系列对象的相互交互作用的方式,使