设计模式之中介者模式

来源:互联网 发布:rhino mac 破解 编辑:程序博客网 时间:2024/06/07 05:33

中介者模式(mediator pattern)属于行为模式,通常,一个程序里包含了多个类,多个类之间要进行交互,这种交互就使得系统各个部分耦合在一起,但系统越复杂,这种耦合就使得系统的重构和维护非常困难,中介者模式就是用于这种相互之间的交互行为导致的耦合问题,它通过一个中介类把类直接通信交互的部分封装起来,各个类相互之间并不需要直接交互,交互由中介类来代理,比如我们去租房子,我们都是通过中介来实现。
下面是中介者模式的C++实现,代码可到本人github网页下载:设计模式例子

/* * Example of 'Mediator' design pattern. * Copyright (C) 2016 Leo Wang  * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */#include <string>#include <map>#include <iostream>using namespace std;class IMediator{public:    virtual void Send(const string& colleagueid,const string& msg)=0;};class IColleague{public:    string s_id;    IMediator* cp_mediator;public:    string getid()    {return s_id;};    void RegistMediator(IMediator* p_mediator)    {        cp_mediator=p_mediator;    };    virtual void Send(const string& colleadgeid,const string& msg){};    virtual void Receive(const string& msg){};public:    IColleague(const string& id)    {        s_id=id;    };};class CConcreteColleagueA:public IColleague{public:    CConcreteColleagueA(const string& id):IColleague(id)    {};public:    void Send(const string& colleadgeid,const string& msg)    {        cout<<s_id+" Calling "+colleadgeid<<endl;        cp_mediator->Send(colleadgeid,msg);     };    void Receive(const string& msg)    {        cout<<s_id+" Received msg: "+msg<<endl;    };};class CConcreteColleagueB:public IColleague{public:    CConcreteColleagueB(const string& id):IColleague(id)    {};public:    void Send(const string& colleadgeid,const string& msg)    {        cout<<s_id+" Calling "+colleadgeid<<endl;        cp_mediator->Send(colleadgeid,msg);     };    void Receive(const string& msg)    {        cout<<s_id+" Received msg: "+msg<<endl;    };};class CConcreteColleagueC:public IColleague{public:    CConcreteColleagueC(const string& id):IColleague(id)    {};public:    void Send(const string& colleadgeid,const string& msg)    {        cout<<s_id+" Calling "+colleadgeid<<endl;        cp_mediator->Send(colleadgeid,msg);     };    void Receive(const string& msg)    {        cout<<s_id+" Received msg: "+msg<<endl;    };};class CConcreteMediator:public IMediator{public:    map<string,IColleague*> m_colleagues;public:    bool IsRegisted(string id)    {        return m_colleagues.find(id)!=m_colleagues.end();    };    void Register(IColleague& colleague)    {        if(!IsRegisted(colleague.getid()))        {            colleague.RegistMediator(this);            m_colleagues[colleague.getid()]=&colleague;         };    };    void Send(const string& colleagueid,const string& msg)    {        if(IsRegisted(colleagueid))        {            m_colleagues[colleagueid]->Receive(msg);        };    };};void main(void){    CConcreteMediator c_mediator;    CConcreteColleagueA c_colleageA("A");    CConcreteColleagueB c_colleageB("B");    CConcreteColleagueC c_colleageC("C");    c_mediator.Register(c_colleageA);    c_mediator.Register(c_colleageB);    c_mediator.Register(c_colleageC);    c_colleageA.Send("B","Message from A to B!");    c_colleageA.Send("C","Message from A to C!");};
1 0
原创粉丝点击