设计模式 中介者模式

1、mediator.h

#ifndef MEDIATOR_H
#define MEDIATOR_H

#include <iostream>
#include <iostream>
#include <map>
using namespace std;

class User;
class Room //Mediator,中介基类
{
public:
    Room();
    virtual ~Room();
    virtual void Register(User*) = 0;
    virtual void Send(char* pFrom, char* pTo, char* pMsg) = 0;
};

class Chatroom : public Room //ConcreteMediator,中介具体类
{
public:
    Chatroom();
    virtual ~Chatroom();
    void Register(User*);
    void Send(char* pFrom, char* pTo, char* pMsg);
private:
    map<char*, User*> m_mapUsers;
};

class User //用户基类
{
public:
    User(char*);
    virtual ~User();
    void Send(char* pTo, char* pMsg);
    virtual void Receive(char* pFrom, char* pMsg);
    void SetChatroom(Chatroom*);
    friend class Chatroom;
private:
    char* m_pName;
    Chatroom* m_pChatroom;
};

class UserInGroupA : public User //具体组用户类A,与B交互通过ConcreteMediator来实现
{
public:
    UserInGroupA(char*);
    virtual ~UserInGroupA();
    virtual void Receive(char* pFrom, char* pMsg);
};

class UserInGroupB : public User //具体组用户类B,与A交互通过ConcreteMediator来实现
{
public:
    UserInGroupB(char*);
    virtual ~UserInGroupB();
    virtual void Receive(char* pFrom, char* pMsg);
};
#endif // MEDIATOR_H

2、mediator.cpp

#include "mediator.h"

Room::Room(){}

Room::~Room(){}

Chatroom::Chatroom(){}

Chatroom::~Chatroom(){}

void Chatroom::Register(User* pUser)
{
    if(m_mapUsers[pUser->m_pName] == NULL)
    {
        m_mapUsers[pUser->m_pName] = pUser;
    }
    pUser->SetChatroom(this);
}

void Chatroom::Send(char* pFrom, char* pTo, char* pMsg)
{
    User* pUserTo = (User*)m_mapUsers[pTo];
    if(pUserTo != NULL)
    {
        pUserTo->Receive(pFrom, pMsg);
    }
}

User::User(char* pName)
{
    m_pName = pName;
}

User::~User()
{
    if(m_pChatroom != NULL)
    {
        delete m_pChatroom;
        m_pChatroom = NULL;
    }
}

void User::Send(char* pTo, char* pMsg)
{
    m_pChatroom->Send(m_pName, pTo, pMsg);
}

void User::SetChatroom(Chatroom* pChatroom)
{
    m_pChatroom = pChatroom;
}

void User::Receive(char* pFrom, char* pMsg)
{
    cout << pFrom << " to " << this->m_pName << " said:'" << pMsg <<"'"<< endl;
}

UserInGroupA::UserInGroupA(char* pName) : User(pName){}

UserInGroupA::~UserInGroupA(){}

void UserInGroupA::Receive(char* pFrom, char* pMsg)
{
    cout << "UserInGroupA receive->:";
    User::Receive(pFrom, pMsg);
}

UserInGroupB::UserInGroupB(char* pName) : User(pName){}

UserInGroupB::~UserInGroupB(){}

void UserInGroupB::Receive(char* pFrom, char* pMsg)
{
    cout << "UserInGroupB receive->:";
    User::Receive(pFrom, pMsg);
}

3、main.cpp
/*
作者:jhluroom弹   QQ:454676244  MSN:jhlu0815@hotmail.com
开发IDE:qt creater
开发环境:QT C++
参考网站:神秘果:http://www.shenmiguo.com/

定义:
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互作用,从而使其耦合松散,
而且可以独立地改变他们之间的交互。

动机:
面向对象设计,鼓励将行为分布在各个对象中,这种分布可能导致对象间有很多链接,在最坏的情况下,每个对象都要知道基他的所有对象,
这样,如果有N个对象,则将会有N*(N-1)/2种情况。

理解:
1.Mediator中介者模式,在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,
  如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。使用一个中介对象来管理对象间的关联关系,
  避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。
2.将多个对象间复杂的关联关系解耦,mediator模式将多个对象间的控制逻辑进行集中管理,变多个对象互相关联为多个对象和
  一个中介者关联,简化了系统的维护,抵御了可能的变化。随着控制逻辑的复杂化,mediator具体对象的实现可能相当复杂。
  这时候可以对mediator对象进行分解处理。Façade模式是解耦系统外到系统内(单向)的对象关联关系;
  mediator模式是解耦系统内各个对象之间(双向)的关联关系。

要点:
1.将系统按功能分割成更小的对象,符合类的最小设计原则.
2.对关联对象的集中控制.
3.减小类的耦合程度,明确类之间的相互关系:当类之间的关系过于复杂时,其中任何一个类的修改都会影响到其他类,
  不符合类的设计的开闭原则,而Mediator模式将原来相互依存的多对多的类之间的关系简化为Mediator控制类与其他关联类的一对多的关系,
  当其中一个类修改时,可以对其他关联类不产生影响(即使有修改,也集中在Mediator控制类)。
4.有利于提高类的重用性.

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

以聊天室的例子说明如下,一个聊天室可以很多成员,成员可以加入不同的讨论组,聊天室就是一个中介,讨论组中的成员通过聊天室发送消息。

以上文字说明,从网上整理而来,有可能部分与其他同仁相同,请谅解,希望我们能够共同交流,谢谢!
*/

#include <QtCore/QCoreApplication>

#include "mediator.h"

int main(int argc, char *argv[])
{
    cout << "=== jhluroom start ========" << endl;

    Chatroom* pChatroom = new Chatroom();

    User* pUserA1 = new UserInGroupA("UserA1");
    User* pUserA2 = new UserInGroupA("UserA2");
    User* pUserB1 = new UserInGroupB("UserB1");

    pChatroom->Register(pUserA1);
    pChatroom->Register(pUserA2);
    pChatroom->Register(pUserB1);

    pUserA1->Send("UserA2", "hello,UserA2");
    pUserA2->Send("UserB1", "hello,UserB1");
    pUserB1->Send("UserA1", "hello,UserA1");

    cout << "=== jhluroom finish _^_ ===" << endl;
    return 0;
}

运行结果:

=== jhluroom start ========

UserInGroupA receive->:UserA1 to UserA2 said:'hello,UserA2'
UserInGroupB receive->:UserA2 to UserB1 said:'hello,UserB1'
UserInGroupA receive->:UserB1 to UserA1 said:'hello,UserA1'

=== jhluroom finish _^_ ===


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值