行为型模式之中介者模式(Mediator)
2017-05-15 16:53
423 查看
1. 意图
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
2. 动机
面向对象设计鼓励将行为分布到各个对象中。这种分布可能会导致对象间有许多连接。在最坏的情况下,每一个对象都知道其他所有对象。虽然将一个系统分割成许多对象通常可以增强可复用性, 但是对象间相互连接的激增又会降低其可复用性。大量的相互连接使得一个对象似乎不太可能在没有其他对象的支持下工作—系统表现为一个不可分割的整体。而且,对系统的行为进行任何较大的改动都十分困难,因为行为被分布在许多对象中。结果是, 你可能不得不定义很多子类以定制系统的行为。
3.结构
• M e d i a t o r(中介者,如D i a l o g D i r e c t o r )
— 中介者定义一个接口用于与各同事( C o l l e a g u e)对象通信。
• C o n c r e t e M e d i a t o r(具体中介者,如F o n t D i a l o g D i r e c t o r )
— 具体中介者通过协调各同事对象实现协作行为。
— 了解并维护它的各个同事。
• Colleague class(同事类,如ListBox, EntryField)
— 每一个同事类都知道它的中介者对象。
— 每一个同事对象在需与其他的同事通信的时候,与它的中介者通信。
4.举例
以租房为例子,如果没有房屋中介,那么房客要自己找房东,而房东也要自己找房客,非常不方便。有了房屋中介机构就方便了,房东可以把要出租的房屋信息放到中介机构,而房客可以去中介机构咨询。在软件中,就是多个对象之间需要通信,如果没有中介,对象就需要知道其他对象,最坏情况下,可能需要知道所有其他对象,而有了中介对象就方便多了,对象只需与中介对象通信,而不用知道其他的对象。这就是中介者模式,下面以租房为例,给出中介者模式的UML图。
C++代码:
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
2. 动机
面向对象设计鼓励将行为分布到各个对象中。这种分布可能会导致对象间有许多连接。在最坏的情况下,每一个对象都知道其他所有对象。虽然将一个系统分割成许多对象通常可以增强可复用性, 但是对象间相互连接的激增又会降低其可复用性。大量的相互连接使得一个对象似乎不太可能在没有其他对象的支持下工作—系统表现为一个不可分割的整体。而且,对系统的行为进行任何较大的改动都十分困难,因为行为被分布在许多对象中。结果是, 你可能不得不定义很多子类以定制系统的行为。
3.结构
• M e d i a t o r(中介者,如D i a l o g D i r e c t o r )
— 中介者定义一个接口用于与各同事( C o l l e a g u e)对象通信。
• C o n c r e t e M e d i a t o r(具体中介者,如F o n t D i a l o g D i r e c t o r )
— 具体中介者通过协调各同事对象实现协作行为。
— 了解并维护它的各个同事。
• Colleague class(同事类,如ListBox, EntryField)
— 每一个同事类都知道它的中介者对象。
— 每一个同事对象在需与其他的同事通信的时候,与它的中介者通信。
4.举例
以租房为例子,如果没有房屋中介,那么房客要自己找房东,而房东也要自己找房客,非常不方便。有了房屋中介机构就方便了,房东可以把要出租的房屋信息放到中介机构,而房客可以去中介机构咨询。在软件中,就是多个对象之间需要通信,如果没有中介,对象就需要知道其他对象,最坏情况下,可能需要知道所有其他对象,而有了中介对象就方便多了,对象只需与中介对象通信,而不用知道其他的对象。这就是中介者模式,下面以租房为例,给出中介者模式的UML图。
C++代码:
#ifndef MEDIATOR_H #define MEDIATOR_H #include <iostream> #include <string> using std::cout; using std::endl; using std::string; class Mediator; class Person{ public: virtual void SetMediator(Mediator*)=0; virtual void SendMessage(string)=0; virtual void GetMessage(string)=0; }; class Mediator{ public: virtual void SetA(Person*)=0; virtual void SetB(Person*)=0; virtual void SentMessage(Person*,string)=0; }; class Renter : public Person{ private: Mediator* p_Mediator; public: virtual void SetMediator(Mediator* pTemp){ p_Mediator=pTemp; } virtual void SendMessage(string temp){ cout<<"租房者发送信息:"<<endl; cout<<temp<<endl; p_Mediator->SentMessage(this,temp); } virtual void GetMessage(string temp){ cout<<"租房者收到信息:"<<endl; cout<<temp<<endl; } }; class LandLord : public Person{ private: Mediator* p_Mediator; public: virtual void SetMediator(Mediator* pTemp){ p_Mediator=pTemp; } virtual void SendMessage(string temp){ cout<<"房东发送信息:"<<endl; cout<<temp<<endl; p_Mediator->SentMessage(this,temp); } virtual void GetMessage(string temp){ cout<<"房东收到信息:"<<endl; cout<<temp<<endl; } }; class HouseMediator : public Mediator{ private: Person* A; Person* B; public: virtual void SetA(Person* temp){ A=temp; } virtual void SetB(Person* temp){ B=temp; } virtual void SentMessage(Person* temp,string data){ if(temp==A) B->GetMessage(data); else A->GetMessage(data); } }; #endif #include "mediator.h" int main(){ Person* James=new Renter; Person* Kobe=new LandLord; Mediator* Wade=new HouseMediator; James->SetMediator(Wade); Kobe->SetMediator(Wade); Wade->SetA(James); Wade->SetB(Kobe); James->SendMessage("我要在洛杉矶租套别墅,风景优美,月租1亿左右!"); Kobe->SendMessage("别墅出租,有山有海,月租8千万!"); return 0; }
相关文章推荐
- 设计模式(17)-行为型-中介者模式(Mediator)
- C#面向对象模式设计第十七讲:Mediator 中介者模式(行为型模式)
- JAVA设计模式(14):行为型-中介者模式(Mediator)
- 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
- 设计模式16:Mediator 中介者模式(行为型模式)
- 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
- C#面向对象设计模式纵横谈 学习笔记17 Mediator 中介者模式(行为型模式)
- 3.5 Mediator(中介者) -- 对象行为型模式
- 设计模式(行为型)之中介者模式(Mediator Pattern)
- 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
- 十七、 Mediator 中介者(行为型模式)
- 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
- 【设计模式-行为型-中介者模式(Mediator)】
- 中介者(Mediator)----对象行为型模式
- 设计模式--行为型-Mediator(中介者)
- 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
- [设计模式笔记]三. 行为型模式--19. Mediator模式(中介者)对象行为型模式(一)
- 行为型模式:Mediator 中介者模式
- 23种设计模式(17)_行为型_中介者模式(Mediator Pattern)
- 设计模式(十六)中介者模式(Mediator)-行为型