Mediator模式(C++实现)

主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。本文介绍中介者模式的实现。

中介者模式:What it is:Define an object that encapsulates how a set of objects interact. Promotes loose coupling by keeping objects from referring to each other explicitly and it lets you vary their interactions independently.

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式的例子很多,大到联合国安理会,小到房屋中介,都扮演了中间者的角色,协调各方利益。

中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了多对多交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。

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

缺点:由于ConcreteMediator控制了集中化。于是就把交互的复杂性变为了中介者的复杂性,使得中介者比任何一个ConcreteColleague都复杂。

本文就以租房为例子,如果没有房屋中介,那么房客要自己找房东,而房东也要自己找房客,非常不方便。有了房屋中介机构就方便了,房东可以把要出租的房屋信息放到中介机构,而房客可以去中介机构咨询。在软件中,就是多个对象之间需要通信,如果没有中介,对象就需要知道其他对象,最坏情况下,可能需要知道所有其他对象,而有了中介对象就方便多了,对象只需与中介对象通信,而不用知道其他的对象。这就是中介者模式,下面以租房为例,给出中介者模式的UML图。

C++代码实现Mediator模式:

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4
 5 /*声明抽象中介类*/
 6 class Mediator;
 7
 8 /*定义抽象人类*/
 9 class Person
10 {
11 public:
12     virtual void SetMediator(Mediator *mediator){}
13     virtual void SendMessage(string message){}
14     virtual void GetMessage(string message){}
15 protected:
16     Mediator *_mediator; //中介
17 };
18
19 /*定义抽象中介类*/
20 class Mediator
21 {
22 public:
23     virtual void Send(string message, Person *person){}
24     virtual void SetRenter(Person *renter){}
25     virtual void SetLandlord(Person *landlord){}
26
27 };
28
29 /*定义租客类*/
30 class Renter:public Person
31 {
32 public:
33     void SetMediator(Mediator *mediator){_mediator = mediator;}
34     void SendMessage(string message){ _mediator->Send(message,this);}
35     void GetMessage(string message){cout<<"租房者收到房东发来的消息:"<<message;}
36 };
37
38 /*定义房东类*/
39 class Landlord:public Person
40 {
41 public:
42     void SetMediator(Mediator *mediator){_mediator = mediator;}
43     void SendMessage(string message){ _mediator->Send(message,this);}
44     void GetMessage(string message){cout<<"房东收到租客发来的消息:"<<message;}
45 };
46
47 /*定义具体中介类*/
48 class HouseMediator:public Mediator
49 {
50 public:
51     HouseMediator():_renter(NULL),_landlord(NULL){}
52     void SetRenter(Person *renter){_renter = renter;}
53     void SetLandlord(Person *landlord){_landlord = landlord;}
54     void Send(string message, Person *person)
55     {//接收消息的对象为该对象的对应对象
56         if(person == _renter)
57             _landlord->GetMessage(message);
58         else
59             _renter->GetMessage(message);
60     }
61 private:
62     Person *_renter;
63     Person *_landlord;
64 };
65 int main(int argc, char *argv[])
66 {
67     Mediator *mediator = new HouseMediator();
68     Person *person1 = new Renter();
69     Person *person2 = new Landlord();
70     mediator->SetRenter(person1);
71     mediator->SetLandlord(person2);
72     person1->SetMediator(mediator);
73     person2->SetMediator(mediator);
74     person1->SendMessage("我想在深圳北站附近租套房子,一室一厅\n");
75     person2->SendMessage("我出租一条房子,一室一厅,深圳北站附近\n");
76     delete person1;
77     delete person2;
78     delete mediator;
79     return 0;
80 }
时间: 2024-10-24 11:24:19

Mediator模式(C++实现)的相关文章

Mediator 模式

在面向对象系统的设计和开发过程中,对象之间的交互和通信是最为常见的情况,因为对象间的交互本身就是一种通信.在系统比较小的时候,可能对象间的通信不是很多.对象也比较少,我们可以直接硬编码到各个对象的方法中.但是当系统规模变大,对象的量变引起系统复杂度的急剧增加,对象间的通信也变得越来越复杂,这时候我们就要提供一个专门处理对象间交互和通信的类,这个中介者就是 Mediator 模式 1 //////////Colleage.h/////////////////////////////////////

Behavioral模式之Mediator模式

1.意图 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互. 2.别名 无 3.动机 面向对象设计鼓励将行为分布到各个对象中.这种分布可能会导致对象间有许多连接.在最坏的情况下,每一个对象都知道其他所有对象. 4.适用性 以下情况使用Mediator模式: 一组对象以定义良好但是复杂的方式进行通信.产生的相互依赖关系结构混乱且难以理解. 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象. 想定制一个分布

Java中介模式(Mediator模式)

Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉及到修改很多其他对象的行为,如果使用Mediator模式,可以使各个对象间的耦合松散,只需关心和 Mediator的关系,使多对多的关系变成了一对多的关系,可以降低系统的复杂性,提高可修改扩展性. 如何使用中介模式 首先 有一个接口,用来定义成员对象之间的交互联系方式:    public inte

Mediator模式

参考资料<大话设计模式> Mediator(中介者)模式: 使各个对象不需要显式的相互调用,从而使其耦合松散. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ds_mediator { class Program { static void Main(string[] args) { ConcreteMediator m = new Concrete

【行为型】Mediator模式

中介者模式目的是将对象间的交互封装在一个对象中,从而使用各对象间的相互依赖解耦,并可以独立更改对像间的交互.在实际项目开发过程中,因某些原因(如:业务逻辑处理不当或设计不当等)使得多个不同对象间需要相互(引用)访问,无形当中使得原本几个不相干的或相对较为独立的几个模块产生了相互依赖.随着依赖程度的恶化,后期项目维护将是十分被动的.举个大家可能平时都有遇到过的例子,A界面点击了某个按钮,导致B界面需要关掉.许多人(尤其是新手程序员)总是在A界面的按钮事件响应时调用了B界面的close()行为.接着

敏捷软件开发 – FACADE模式和MEDIATOR模式

FACADE模式 Db类使得Application类不需要了解System.Data命名空间中的内部细节.它把System.Data的所有通用性和复杂性隐藏在一个非常简单且特定的接口后面. 像Db这样的FACADE类对System.Data的使用施加了许多规约.它知道如何初始化和关闭数据库连接.它知道如何将ProductData的成员变量转换成数据库字段,或反之.它知道如何去构建合适的查询和命令去操纵数据库.它对用户隐藏了所有的复杂性.在Application看来,System.Data是不存在

Java 实现中介者(Mediator)模式

类图 public interface IMediator { public void createMediator(); public void work(); } /** * 中介.调节实际上需要交互的两个元素,让其松耦合 * @author stone * */ public class Mediator implements IMediator { private XmlCode xmlCode; private XmlPreview xmlPreview; @Override publ

【图解设计模式】Mediator模式

组员向仲裁者报告,仲裁者向组员下达指示.组员之间不再相互询问和相互指示. 示例 一个GUI应用程序,它展示了一个登录对话框,用户在其中输入正确的用户名和密码后可以登录. 可以选择作为游客访问(Guest)或是作为用户登录(Login) 作为用户登录时,需要输入正确的用户名(Username)和密码(Password) 点击OK按钮可以登录,点击Cancel按钮可以取消登录 类图 时序图 Mediator接口 1234 public interface { public abstract void

重构if...else...或者switch程序块 为 中介者(Mediator)模式.的思考

http://www.cnblogs.com/insus/p/4142264.html 首先普世的编程架构好坏评判是SOLID(单一功能.开闭原则.里氏替换.接口隔离以及依赖反转) 具体来说,就是当有需求的curd时候,代码应该1)涉及的文件尽可能的少2)修改的文件行数尽可能的少3)修改的文件行块间距不应该太长,避免程序员在一个文件中来回移动.鼠标点击数尽可能少.避免影响思路.4)不应该影响其他模块的.这样就不必全面回归测试.5)鲁棒性:即使输入错误,也不应该系统崩溃. 那么,我们来看看这篇洋洋