行为型模式之中介者模式(Mediator)

本文深入探讨了中介者模式在面向对象设计中的重要性,旨在减少对象间的直接交互,提高系统的可复用性和可维护性。通过定义一个中介者接口和具体中介者类,实现了同事对象之间的协作行为。中介者模式以租房为例进行说明,展示了如何通过中介对象简化对象间的通信,避免对象之间复杂的依赖关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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++代码:

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值