设计模式-中介者模式(C++)

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

使用场合

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

优缺点

1、减少了子类生成,Mediator将原本分布于多个对象间的行为集中在一起。改变这些行为只需生成Meditator的子类即可。这样各个Colleague类可被重用;

2、它将各Colleague解耦,Mediator有利于各Colleague间的松耦合。你可以独立的改变和复用各Colleague类和Mediator类;

3、它简化了对象协议,用Mediator和Colleague间的一对多的交互来代替多对多的交互。一对多的关系更容易理解、维护和扩展;

4、它对对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,使你将注意力从对象各自本身的行为转移到它们之间的交互上来。这有助于弄清楚一个系统中的对象是如何交互的;

5、它使控制集中化,中介者模式将交互的复杂性变为中介者的复杂性。因为中介者封装了协议,它可能变得比任一个Colleague都复杂。这可能使得中介者自身成为一个难于维护的庞然大物。

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

#include<iostream>
#include<cstring>

using namespace std;

class Person;

class Mediator
{
public:
    virtual void Send(string message, Person* person)  = 0;
    virtual void SendA(Person * A) = 0;
    virtual void SendB(Person * B) = 0;
};

class Person
{
protected:
    Mediator * m_mediator;
public:
    virtual void SetMediator(Mediator * mediator) = 0;
    virtual void SendMessage(string message) = 0;
    virtual void GetMessage(string message) = 0;
};

class Renter : public Person
{
public:
    void SetMediator(Mediator * mediator) { m_mediator = mediator; }
    void SendMessage(string message) { m_mediator->Send(message, this); }
    void GetMessage(string message) { cout << "renter recev message:"<< message << endl; }
};

class Landlord : public Person
{
public:
    void SetMediator(Mediator * mediator) { m_mediator = mediator; }
    void SendMessage(string message) { m_mediator->Send(message, this); }
    void GetMessage(string message) { cout << "Landlord recev message:" << message << endl; }
};

class HouseMediator : public Mediator
{
public:
    HouseMediator():m_A(0),m_B(0) {}
    void SendA(Person * A) {m_A = A;}
    void SendB(Person * B) {m_B = B;}
    void Send(string message, Person * person)
    {
        if(m_A == person)
        {
            m_B->GetMessage(message);
        }
        else
        {
            m_A->GetMessage(message);
        }
    }
private:
    Person * m_A;
    Person * m_B;
};

int main()
{
    Mediator * mediator = new HouseMediator();
    Person * person1 = new Renter();
    Person * person2 = new Landlord();

    person1->SetMediator(mediator);
    person2->SetMediator(mediator);
    mediator->SendA(person1);
    mediator->SendB(person2);

    person1->SendMessage("Renter");
    person2->SendMessage("Landlord");
    
    delete mediator;
    delete person1;
    delete person2;
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值