中介者模式(Mediator)
2014-09-16 07:11
169 查看
1.目的
当两个或多个对象之间要建立关联的时候,可以让他们之间不建立直接的关联(A对象不知道B对象,也即不持有其引用或指针),而是通过另外一个对象(Mediator或其实现子类)来建立关联,也即Mediator持有A和B两个对象的指针或引用,当A与B之间要通信时,由Mediator来中转。
中介者模式有个前提,A与B要发生关联,但是A并不知道B的引用,也即A不持有或者找不到B的对象(可能它只知道B的一个名称,或者连B的名称都不知道,下面的例子中,A并没有指定其通信的对象),所有的关联的建立,都是在Mediator中完成。Mediator持有A和B的引用,它可以建立两个对象的关联
这个与现实生活中的例子是一样的,买方不知道卖方的信息,卖方不知道买方的信息,中介知道买方和卖方的信息,买方要找到卖方,或者卖方要找到买方,大家都去找中介,由中介来建立买方和卖方的关联,同时继续保持双方相互不知道对方的状态
2.代码
Mediator.h
运行结果
Colleague2 receive announce from col1
Colleague1 receive announce from col2
当两个或多个对象之间要建立关联的时候,可以让他们之间不建立直接的关联(A对象不知道B对象,也即不持有其引用或指针),而是通过另外一个对象(Mediator或其实现子类)来建立关联,也即Mediator持有A和B两个对象的指针或引用,当A与B之间要通信时,由Mediator来中转。
中介者模式有个前提,A与B要发生关联,但是A并不知道B的引用,也即A不持有或者找不到B的对象(可能它只知道B的一个名称,或者连B的名称都不知道,下面的例子中,A并没有指定其通信的对象),所有的关联的建立,都是在Mediator中完成。Mediator持有A和B的引用,它可以建立两个对象的关联
这个与现实生活中的例子是一样的,买方不知道卖方的信息,卖方不知道买方的信息,中介知道买方和卖方的信息,买方要找到卖方,或者卖方要找到买方,大家都去找中介,由中介来建立买方和卖方的关联,同时继续保持双方相互不知道对方的状态
2.代码
Mediator.h
#ifndef MEDIATOR_H_ #define MEDIATOR_H_ #include <string> class Colleague; class Mediator { public: virtual ~Mediator(); virtual void send(std::string, Colleague&)=0; void setColleague1(Colleague&); void setColleague2(Colleague&); protected: Colleague* coll1; Colleague* coll2; }; class ConcreteMediator:public Mediator { public: void send(std::string, Colleague&); }; class Colleague { public: Colleague(Mediator&); virtual ~Colleague(); void send(std::string, Colleague&); virtual void notify(std::string)=0; private: Mediator* mediator; }; class Colleague1:public Colleague { public: Colleague1(Mediator&); void notify(std::string); }; class Colleague2:public Colleague { public: Colleague2(Mediator&); void notify(std::string); }; #endif /* MEDIATOR_H_ */
#include "Mediator.h" #include <iostream> using namespace std; Mediator::~Mediator() {} void Mediator::setColleague1(Colleague& arg) { coll1 = &arg; } void Mediator::setColleague2(Colleague& arg) { coll2 = &arg; } void ConcreteMediator::send(string arg, Colleague& sender) { if(&sender == coll1) { coll2->notify(arg); } else { coll1->notify(arg); } } Colleague::Colleague(Mediator& arg):mediator(&arg) {} Colleague::~Colleague() {} void Colleague::send(string arg1, Colleague& arg2) { if(NULL != mediator) { mediator->send(arg1, arg2); } } Colleague1::Colleague1(Mediator& arg):Colleague(arg) {} void Colleague1::notify(string arg) { cout<<"Colleague1 receive "<<arg<<endl; } void Colleague2::notify(string arg) { cout<<"Colleague2 receive "<<arg<<endl; } Colleague2::Colleague2(Mediator& arg):Colleague(arg) {} void Mediator() { ConcreteMediator mediator; Colleague1 col1(mediator); Colleague2 col2(mediator); mediator.setColleague1(col1); mediator.setColleague2(col2); col1.send("announce from col1", col1); col1.send("announce from col2", col2); }
运行结果
Colleague2 receive announce from col1
Colleague1 receive announce from col2
相关文章推荐
- 设计模式----Mediator(中介者)模式
- 设计模式(21)-中介者模式(Mediator)
- 设计模式之Mediator(中介者)
- C#面向对象设计模式纵横谈 学习笔记17 Mediator 中介者模式(行为型模式)
- 中介者模式(Mediator Pattern)
- 设计模式之Mediator中介者模式
- 中介者模式(Mediator)
- Mediator 中介者模式
- 中介者模式(Mediator Pattern)
- 中介者模式(Mediator pattern)
- 设计模式之Mediator(中介者)
- 设计模式之Mediator(中介者)
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
- Mediator Pattern(中介者模式)
- 设计模式袖珍版 连续转载之 - Mediator(中介者)
- 第三十一章 中介者模式(Mediator Pattern)
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
- 中介者模式(Mediator)
- 设计模式之Mediator(中介者)
- [导入]C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式.zip(8.75 MB)