大话设计模式C++实现-第25章-中介者模式

一、UML

二、概念

中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

三、说明

角色:

(1)Colleague:抽象同事类。

(2)ConcreteClleague:具体同事类,每个具体同事只知道自己的行为,而不了解其他同事类的情况,但它们却都认识中介者对象。

(3)Mediator:抽象中介者,定义了同事对象到中介者对象的接口。

(4)ConcreteMediator:具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令。

中介者模式的优点?

(1)Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague,比如任何国家的改变不会影响到其他国家,而只是与安理会发生变化。

(2)由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装起在一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就是站在一个更宏观的角度去看待系统。

中介者模式的缺点?

由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague都复杂。

中介者模式的用途?

中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。

四、C++实现

(1)UN.h

#ifndef _UN
#define _UN
#include <string>
class Country;
using namespace std;

//Mediator
class UnitedNations
{
public:
	virtual void setColleague1(Country* c)=0;
	virtual void setColleague2(Country* c)=0;
	virtual void Declare(string message, Country* colleague)=0;
};

//ConcreteMediator
class UnitedNationsSecurityCouncil:public UnitedNations
{
private:
	Country* colleague1;
	Country* colleague2;

public:
	void setColleague1(Country* c);
	void setColleague2(Country* c);
	void Declare(string message, Country* colleague);
};

#endif

(2)UN.cpp

#include <string>
#include "UN.h"
#include "Country.h"
using namespace std;

void UnitedNationsSecurityCouncil::setColleague1(Country* c)
{
	this->colleague1=c;
}

void UnitedNationsSecurityCouncil::setColleague2(Country* c)
{
	this->colleague2=c;
}

void UnitedNationsSecurityCouncil::Declare(string message, Country* colleague)
{
	if(colleague==this->colleague1)
		colleague2->GetMessage(message);
	else
		colleague1->GetMessage(message);
}

(3)Country.h

#ifndef _COUNTRY
#define _COUNTRY

#include <string>
#include "UN.h"
#include <iostream>

using namespace std;

//Colleague
class Country
{
protected:
	UnitedNations* mediator;
public:
	/*Country(UnitedNations* m)
	{
		this->mediator=m;
	}*/
	virtual void Declare(string message)=0;
	virtual void GetMessage(string message)=0;
};

//ConcreteColleague
class USA:public Country
{
public:
	USA(UnitedNations* m)
	{
		this->mediator=m;
	}
	void Declare(string message);
	void GetMessage(string message);
};

//ConcreteColleague
class Iraq:public Country
{
public:
	Iraq(UnitedNations* m)
	{
		this->mediator=m;
	}
	void Declare(string message);
	void GetMessage(string message);
};

#endif

(4)Country.cpp

#include "Country.h"
#include <string>
#include <iostream>

using namespace std;

void USA::Declare(string message)
{
	mediator->Declare(message,this);
}

void USA::GetMessage(string message)
{
	cout<<"美国获得对方信息:"<<message<<endl;
}

void Iraq::Declare(string message)
{
	mediator->Declare(message,this);
}

void Iraq::GetMessage(string message)
{
	cout<<"伊拉克获得对方信息:"<<message<<endl;
}

(5)运行截图

时间: 2024-11-05 13:43:38

大话设计模式C++实现-第25章-中介者模式的相关文章

大话设计模式C++实现-第15章-抽象工厂模式

一.UML图 二.概念 抽象方法模式(Abstract Factory):提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们详细的类. 三.包括的角色 (1)抽象工厂 (2)详细工厂:包含详细工厂1和详细工厂2.详细工厂1用于生产详细产品A1和详细产品B1,详细工厂2用于生产详细产品A2和详细产品B2: (3)抽象产品:包含抽象产品A和抽象产品B. (4)详细产品:包含抽象产品A所相应的详细产品A1和A2.以及抽象产品B所相应的详细产品B1和B2. 说明:在<大话设计模式>中,上述的1

《大话设计模式》学习笔记21:中介者模式

同事间接收消息示例: 1.Mediator: public abstract class Mediator { public abstract void Send(string message, Colleague colleague); } 2.Colleague: public abstract class Colleague { protected Mediator mediator; public Colleague(Mediator mediator) { this.mediator

第25章中介者模式

一 概念 中介者模式,用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 二 UML图 Mediator 抽象中介者,定义了同事对象到中介者对象的接口 Colleague 抽象同事类 ConcreteMediator 具体中介者对象,实现抽象类方法,它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令. ConcreteColleague1 具体同事类,每个具体同事只知道自己的行为,而不了解其它同事类的

大话设计模式C++实现-第24章-职责链模式

一.UML图 二.概念 职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合.将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止. 三.说明  角色: (1)Handler类:定义一个处理请求的接口. (2)ConcreteHandler类:具体的处理请求的接口. 职责链模式的好处: (1)最关键的是,当客户提交一个请求时,请求时沿链传递直至有一个ConcreteHandler对象负责处理它. (2)

大话设计模式C++实现-第8章-工厂方法模式

一.UML图 二.概念 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法是一个类的实例化延迟到其子类. 三.包括的角色 (1)抽象工厂 (2)详细工厂 (3)抽象产品 (4)详细产品 四.优势 (1)工厂方法模式是对简单工厂模式的略微的改进.工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际工作推迟到子类中. (2)与简单工厂模式相比,制造产品的工厂类不再 仅仅有一个.而是每种详细产品类都相应一个生产它的详细工厂类. 而这些详细

大话设计模式C++实现-第26章-享元模式

一.UML图 二.概念 享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象. flyweight的意思:轻量级. 三.说明 角色: (1)Flyweight类:它是所有具体享元类的超类或接口,通过这个接口,Flyweight可以接受并作用于外部状态. (2)ConcreteFlyweight类:继承Flyweight超类或实现Flyweight接口,并为内部状态增加存储空间. (3)UnsharedConcreteFlyweight:是指那些不需要共享的Flyweight子类

设计模式之第19章-中介者模式(Java实现)

设计模式之第19章-中介者模式(Java实现) “测试妹纸找你,你的代码出问题了.”“美工妹纸让你看看界面怎么样.”身为程序员总要和各种人打交道,但是如果再分为前端.后端工程师的话,那么关系就会错综复杂起来了,这个时候如果有中介者进行中转,类似于星型网络拓扑的交换机,那么该有多好.(PS:注孤生啊,和测试妹纸.美工妹纸什么的一起讨论增进感情多好,那么好的机会都不珍惜.编者按:我是要做那个中介者,懂么?中介者!众人:good job!)“鱼哥,叫我干嘛?”真是说曹操曹操到,刚刚正说你来着,行了,你

设计模式@第25章:策略模式

第25章:策略模式 一.编写鸭子项目,具体要求如下: 有各种鸭子(比如 野鸭.北京鸭.水鸭等, 鸭子有各种行为,比如 叫.飞行等) 显示鸭子的信息 二.传统方案解决鸭子问题的分析和代码实现 传统的设计方案(类图) 代码实现-看老师演示 Duck 抽象类 package com.gjxaiou.strategy; public abstract class Duck { public Duck() { } public abstract void display();//显示鸭子信息 public

第17章 中介者模式(Mediator Pattern)

原文 第17章 中介者模式(Mediator Pattern) 中介者模式  概述:   在软件开发中,我们有时会碰上许多对象互相联系互相交互的情况,对象之间存在复杂的引用关系,当需求更改时,对系统进行修改将会非常困难.为了对系统的对象进行解耦,可以引入一个间接层来管理对象之间的关系,这就是中介者模式. 结构图:             借图理解:    使用中介者              示例:   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1