Mediator模式

来源:互联网 发布:黑龙江农垦网络 编辑:程序博客网 时间:2024/05/16 19:02
Mediator模式


    Mediator模式是一种很有用的模式,它通过将对象间的通信封装到一个类中,将多对多的通信转化为一对多的通信,降低了系统的复杂性。
    面向对象设计激励将行为分布到各个对象中,但这种分布可能会导致对象间有许多连接,在最坏的情况下,每一个对象都知道其他所有对象,
想到了"图"有木有。。。Mediator模式用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,从而使其耦合松散,
从而可以独立地改变它们之间的交互,还有一个优点就是控制集中、便于管理。
C++代码示例:

//colleage.h

#ifndef COLLEAGE_H#define COLLEAGE_H#include <string>#include <iostream>using namespace std;class Mediator;class Colleage{public:    virtual ~Colleage();    virtual void Action() = 0;    virtual void setState(const string &sta) = 0;    virtual string getState() = 0;protected:    Colleage();    Colleage(Mediator *med);    Mediator* m_med;};class ConcreteColleageA : public Colleage{public:    ConcreteColleageA();    ConcreteColleageA(Mediator *med);    ~ConcreteColleageA();    void Action();    void setState(const string &sta);    string getState();private:    string m_str;};class ConcreteColleageB : public Colleage{public:    ConcreteColleageB();    ConcreteColleageB(Mediator* med);    ~ConcreteColleageB();    void Action();    void setState(const string &sta);    string getState();private:    string m_str;};#endif // COLLEAGE_H

//colleage.cpp

#include "colleage.h"#include "mediator.h"Colleage::Colleage(){}Colleage::Colleage(Mediator *med){    this->m_med = med;}Colleage::~Colleage(){}ConcreteColleageA::ConcreteColleageA(){}ConcreteColleageA::~ConcreteColleageA(){}ConcreteColleageA::ConcreteColleageA(Mediator *med)    : Colleage(med){}string ConcreteColleageA::getState(){    return m_str;}void ConcreteColleageA::setState(const string &sta){    m_str = sta;}void ConcreteColleageA::Action(){    m_med->DoActionFromAtoB();    cout << "State of ConcreteColleageB: " << this->getState() << endl;}ConcreteColleageB::ConcreteColleageB(){}ConcreteColleageB::~ConcreteColleageB(){}ConcreteColleageB::ConcreteColleageB(Mediator *med)    : Colleage(med){}void ConcreteColleageB::Action(){    m_med->DoActionFromBtoA();    cout << "State of ConcreteColleageA: " << this->getState() << endl;}string ConcreteColleageB::getState(){    return m_str;}void ConcreteColleageB::setState(const string &sta){    m_str = sta;}

//mediator.h

#ifndef MEDIATOR_H#define MEDIATOR_Hclass Colleage;class Mediator{public:    virtual ~Mediator();    virtual void DoActionFromAtoB() = 0;    virtual void DoActionFromBtoA() = 0;protected:    Mediator();};class ConcreteMediator : public Mediator{public:    ConcreteMediator();    ConcreteMediator(Colleage* collA,Colleage* collB);    ~ConcreteMediator();    void setConcreteColleageA(Colleage* collA);    void setConcreteColleageB(Colleage* collB);    Colleage* getConcreteColleageA();    Colleage* getConcreteColleageB();    void introColleage(Colleage* collA,Colleage* collB);    void DoActionFromAtoB();    void DoActionFromBtoA();private:    Colleage *m_collA;    Colleage *m_collB;};#endif // MEDIATOR_H

//mediator.cpp

#include "mediator.h"#include "colleage.h"Mediator::Mediator(){}Mediator::~Mediator(){}ConcreteMediator::ConcreteMediator(){}ConcreteMediator::~ConcreteMediator(){}ConcreteMediator::ConcreteMediator(Colleage *collA, Colleage *collB){    this->m_collA = collA;    this->m_collB = collB;}void ConcreteMediator::DoActionFromAtoB(){    m_collB->setState(m_collA->getState());}void ConcreteMediator::DoActionFromBtoA(){    m_collA->setState(m_collB->getState());}void ConcreteMediator::setConcreteColleageA(Colleage *collA){    this->m_collA = collA;}void ConcreteMediator::setConcreteColleageB(Colleage *collB){    this->m_collB = collB;}Colleage* ConcreteMediator::getConcreteColleageA(){    return m_collA;}Colleage* ConcreteMediator::getConcreteColleageB(){    return m_collB;}void ConcreteMediator::introColleage(Colleage *collA, Colleage *collB){    this->m_collA = collA;    this->m_collB = collB;}

//main.cpp

#include "mediator.h"#include "colleage.h"#include <iostream>int main(){    ConcreteMediator* m = new ConcreteMediator();    ConcreteColleageA* ccA = new ConcreteColleageA(m);    ConcreteColleageB* ccB = new ConcreteColleageB(m);    m->introColleage(ccA,ccB);    ccA->setState("old");    ccB->setState("old");    ccA->Action();    ccB->Action();    cout << endl;    ccA->setState("new");    ccA->Action();    ccB->Action();    cout << endl;    ccB->setState("old");    ccB->Action();    ccB->Action();    return 0;}
运行结果:





                                             
0 0
原创粉丝点击