Mediator Design Pattern 中介者模式

就是设计一个Mediator类,可以处理其他类的关系。

Mediator类:

1 拥有其他所有类的实例对象

2 设置一个接口供其他类使用,其他类也拥有一个Mediator类成员,只需调用这个Mediator接口函数使用,无需自己处理关系。

3 Mediator内部已经设置好各个类的关系了,其他类只要直接使用Mediator处理关系就可以了。

下面是一个聊天室聊天是处理关系的实例程序:

进入聊天室的人只需要选定和谁聊天就可以了,无需担心这些信息是如何传递的,这个已经由Mediator自动处理了。

不能对未进入聊天室的人聊天。

可以看出这样的代码还是十分简洁清晰的,如果不使用这个模式,那么会臃肿很多,而且每次send都要写更多额外的代码。

使用Mediator设计模式之后,每次只需要send就可以发送信息到需要的人了。

#include <stdio.h>
#include <vector>
#include <string>
using std::string;
using std::vector;

class RoomMember;

class Mediator
{
protected:
	vector<RoomMember *> rms;
public:
	virtual void enterRoom(RoomMember *mem)
	{
		rms.push_back(mem);
	}
	virtual void send(string mes, RoomMember *rm) = 0;
};

class RoomMember
{
protected:
	Mediator *mediator;
public:
	string name;

	RoomMember(Mediator *m, string n) : mediator(m), name(n) {}
	virtual void send(string mes, RoomMember *to)
	{
		printf("%s send a message.\n", name.c_str());
		mediator->send(mes, to);
	}

	virtual void notify(string mes)
	{
		printf("%s got a message: %s\n", name.c_str(), mes.c_str());
	}
};

class MessageMediator : public Mediator
{
public:
	void send(string mes, RoomMember *mem)
	{
		auto it = rms.begin();
		for ( ; it != rms.end(); it++)
		{
			if (*it == mem) break;
		}
		if (it == rms.end())	//不能是*it != mem,因为it == rms.end()为空指针
		{
			printf("Not member %s in the room\n", mem->name.c_str());
			return ;
		}
		mem->notify(mes);
	}
};

int main()
{
	Mediator *mediator = new MessageMediator;
	RoomMember *Jelly = new RoomMember(mediator, "Jelly");
	RoomMember *Kelly = new RoomMember(mediator, "Kelly");
	RoomMember *Billy = new RoomMember(mediator, "Billy");
	RoomMember *Silly = new RoomMember(mediator, "Silly");

	mediator->enterRoom(Jelly);
	mediator->enterRoom(Kelly);
	mediator->enterRoom(Billy);

	Jelly->send("How are you?", Kelly);
	Kelly->send("Never better.", Jelly);
	Jelly->send("Where are you?", Billy);
	Kelly->send("What are you doing?", Silly);

	delete Silly;
	delete Kelly;
	delete Billy;
	delete Jelly;
	delete mediator;
	return 0;
}

运行:

Mediator Design Pattern 中介者模式

时间: 2024-10-29 04:13:20

Mediator Design Pattern 中介者模式的相关文章

Design Pattern Singleton 单一模式

单一模式的几个注意点: 一) 设计单一模式,首先需要把构造函数给私有化了,不让外界访问,那么外界只能通过提供的函数获取一个新的类. 二) C++的单一模式,记得要在类外初始化一个类,否则或内存出错的. 三) 这个唯一的类必须是要静态的 程序: #ifndef _SINGLETON_H #define _SINGLETON_H #include <iostream> #include <string> using namespace std; class DuGuJiuJian {

Design Pattern Visitor 访问者模式

访问者模式,就是我们已经有一系列的对象了,那么就可以使用一个visitor对象一次性遍历所有的对象,就好像这个visitor访问了所有这些对象一样,所以就叫访问者模式. 实现起来也很简单,就是三个基类,其他类都是这些基类的衍生类. 下面的Action类就是访问者类了,而Person类就是被访问的对象类,而House是一个接待容器,可以接待不同的Action类. #include <stdio.h> #include <iostream> #include <string>

Strategy Design Pattern(策略模式)

策略模式意义在于,当我们有多种不同的算法时,程序能够动态的选择算法进行计算. 策略模式的另外一个英文名字是Policy Strategy. 策略模式最典型的里一个例子就是JAVA中复杂对象的排序(java.util.Arrays.sort,java.util.Collections.sort),用户可以自己定义各种排序算法(规则),然后在需要排序时将算法传给排序函数.从而实现排序方式的变化,获得不同的排序结果.参见:http://my.oschina.net/nox/blog/487478 下面

Proxy Design Pattern(代理模式)

代理模式的目标是通过代理类来隔离访问者对目标类的直接访问,访问者只能访问代理类,这样能够保证访问者对目标类的访问是受限的. 比如访问某些资源,如果访问者不具备访问的权限或条件,则代理类可以拒绝访问者的访问.这是常见实现权限的方式之一. 简单的代码可以描述该模式: package dp.proxy; public interface FileAccessor{ public void readFile(String filePath); } package dp.proxy; public cla

[Design Pattern] 抽象工厂模式

工厂方法模式 让一个具体的类对应一个工厂.然后把所有工厂进行抽象.通过抽象工厂实现具体的工厂来创建对象.如果需要新增一个类,那么就需要创建一个工厂类来创建对象 优点: 1. 符合开闭原则.是简单工厂改进 2. 实现创建和使用分离 缺点: 1. 类的个数庞大.增加一个具体对象类就需要增加一个对应工厂类.增加维护成本 参考代码: class Fruit { public: virtual void showName() = 0; }; class Apple : public Fruit { pub

设计模式-行为型模式-中介者模式

中介者要解决的问题 中介者模式(Mediator Pattern)是用来降低多个对象和类之间通信的复杂度.这种模式提供了一个中介类,该类通常用来处理不同类之间的通信.中介者模式符合迪米特原则,即一个类应当尽量减少与其他类的联系. 实例描述 在我们现实生活中就有这样的例子,你如果去租房,你可能会在网站上找一些发布租房的信息,找到对应的房东.为了能够找到性价比高的房子,你可能找好多家,那么你都要和这些房东打交道,留下电话啥的.有时候房子不好出租的情况下,房东还会主动联系你,就有了下面这幅图: 我们可

从特工的角度来看设计模式之中介者模式

  转载请声明:http://www.cnblogs.com/courtier/p/4292201.html 中介者模式简介:        多个类之间的通讯方式封装成一个对象,只能,从这个对象转发给多个类.        从代码的角度来理解(特工与特工之间只能通过情况报站(MEDIATOR)来交换信息) package mediator; //特工类 public abstract class ColleaugeAgent { //特工必须是相互是不能认识的,不能交流的,不能说话,只有,通过情

简单工厂设计模式(Simple Factory Design Pattern)

[引言]最近在Youtub上面看到一个讲解.net设计模式的视频,其中作者的一个理解让我印象很深刻:所谓的设计模式其实就是运用面向对象编程的思想来解决平时代码中的紧耦合,低扩展的问题.另外一点比较有见解的是,区分了设计模式(Design Pattern),结构模式(Architecture Pattern),架构类型(Architecture Style). 如下图所示 Design Pattern:是基于代码层面的,就是针对解决功能模块之间的问题而采用恰当的设计模式,比如依赖注入,简单工厂,适

深入浅出设计模式——中介者模式(Mediator Pattern)

模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题:? 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他所有对象,并进行适当处理.? 对象可重用性差:由于一个对象和其他对象具有很强的关联,若没有其他对象的支持,一个对象很难被另一个系统或模块重用,这些对象表现出来更像一个不可分割的整体,职责较为混乱.? 系统扩展性低:增加一个新的对象需要在原有相关对象上增加引用,增加新的引用关系也需要调整原有对象,系统