Mediator模式

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_H

class 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值