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

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

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

  1 // Mediator.cpp : 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include<iostream>
  6 #include <string>
  7 using namespace std;
  8 
  9 class Mediator;
 10 
 11 class Person
 12 {
 13 protected:
 14     Mediator *m_mediator; //中介
 15 public:
 16     virtual void SetMediator(Mediator *mediator){} //设置中介
 17     virtual void SendMessage(string message) {}    //向中介发送信息
 18     virtual void GetMessage(string message) {}     //从中介获取信息
 19 };
 20 
 21 class Mediator
 22 {
 23 public:
 24     virtual void Send(string message,Person *person) {}
 25     virtual void SetA(Person *A) {}
 26     virtual void SetB(Person *B) {}
 27 };
 28 
 29 class Renter:public Person
 30 {
 31 public:
 32     void SetMediator(Mediator *mediator)
 33     {
 34         m_mediator = mediator;
 35     }
 36     void SendMessage(string message) 
 37     {
 38         m_mediator->Send(message,this);
 39     } 
 40     void GetMessage(string message)
 41     {
 42         cout<<"租房者收到信息"<<message<<endl;
 43     }
 44 };
 45 
 46 class Landlord:public Person
 47 {
 48     void SetMediator(Mediator *mediator)
 49     {
 50         m_mediator = mediator;
 51     }
 52     void SendMessage(string message) 
 53     {
 54         m_mediator->Send(message,this);
 55     } 
 56     void GetMessage(string message)
 57     {
 58         cout<<"房东收到信息"<<message<<endl;
 59     }
 60 };
 61 
 62 //房屋中介
 63 class HouseMediator : public Mediator
 64 {
 65 private:
 66     Person *m_A; //租房者
 67     Person *m_B; //房东
 68 public:
 69     HouseMediator(): m_A(0), m_B(0) {}
 70     void SetA(Person *A) { m_A = A; }
 71     void SetB(Person *B) { m_B = B; }
 72     void Send(string message, Person *person) 
 73     {
 74         if(person == m_A) //租房者给房东发信息
 75             m_B->GetMessage(message); //房东收到信息
 76         else
 77             m_A->GetMessage(message);
 78     }
 79 };
 80 
 81 
 82 int _tmain(int argc, _TCHAR* argv[])
 83 {
 84     cout<<"中介者模式:"<<endl;
 85 
 86     Mediator *mediator = new HouseMediator();
 87     Person *person1 = new Renter();    //租房者
 88     Person *person2 = new Landlord();  //房东
 89     mediator->SetA(person1);
 90     mediator->SetB(person2);
 91     person1->SetMediator(mediator);
 92     person2->SetMediator(mediator);
 93     person1->SendMessage("我想在南京路附近租套房子,价格800元一个月\n");
 94     person2->SendMessage("出租房子:南京路100号,70平米,1000元一个月\n");
 95     delete person1; 
 96     delete person2; 
 97     delete mediator;
 98     system("pause");
 99     return 0;
100 }

 

posted @ 2018-07-13 10:06  wxmwanggood  阅读(211)  评论(0编辑  收藏  举报