中介者模式

中介者模式

动机(Motivation)
➢在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一-种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。
➢在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。
问题的引入一联合国沟通世界各国

  • 生活中处处充斥着“中介者”,比如租房、买房、出国留学、找工作、旅游等等可能都需要那些中介者的帮助。
  • 地球上最大的中介者就是联合国,它主要用来维护国际和平与安全、解决国际间经济、社会、文化和人道主义性质的问题。国与国之间的关系异常复杂,会因为各种各样的利益关系来结成盟友或者敌人,没有永远的朋友,也没有永远的敌人,只有永远的利益!所以国与国之间的关系同样会随着时间、环境因为利益而发生改变。
  • 在一个公司内部,有很多部门、员工(我们统称他们互相为Colleague"同事”),为了完成一定的任务,“同事” 之间肯定有许多需要互相配合、交流的过程。如果由各个“同事”频繁地到处去与自己有关的“同事”沟通,这样肯定会形成一个多对多的杂乱的联系网络而造成工作效率低下。此时就需要一位专门的“中介者”给各个“同事”分配任务以及统一跟进大家的进度,并在“同事”之间实时地进行交互,保证“同事”之间必须的沟通交流。此时的“中介者“担任了沟通“同事”彼此的重要角色,减轻了每个“同事”的负担,提高了工作效率。
  • 如果没有主板,电脑中的硬件将如何交互,有了主板呢?
  • Mediator模式将对象间的交互和通信封装在一个类中,各个对象间的通信不必显式去声明和引用,大大降低了系统的复杂性能(了解一个对象总比深入熟悉n个对象要好)。
  • Mediator模式还带来了系统对象间的松耦合。
  • 通过中介者模式,可以将复杂关系的网状结构变成结构简单的以中介者为核心的星形结构,每个对象不再和它与之关联的对象直接发生相互作用,而是通过中介者对象来与另一个对象发生相互作用。

Mediator模式定义
用一个中介对象来封装(封装变化)一系列的对象交互。中介者使各对象不需要显式的相互引用(编译时依赖→运行时依赖),从而使其耦合松散(管理变化),而且可以独立地改变它们之间的交互。

//抽象中介类
abstract class Mediator{
	public abstract void Send(String message,Colleague colleague);
}
//抽象同事类
abstract class Colleague{
	protected Mediator mediator;
	public Colleague(Mediator mediator) {
		this.mediator=mediator;
	}
}
class ConcreteColleague1 extends Colleague{

	public ConcreteColleague1(Mediator mediator) {
		super(mediator);
		// TODO Auto-generated constructor stub
	}
	public void Send(String message) {
		mediator.Send(message, this);
	}
	public void Notify(String message) {
		System.out.println("同事1得到的信息:"+message);
	}
}
class ConcreteColleague2 extends Colleague{

	public ConcreteColleague2(Mediator mediator) {
		super(mediator);
		// TODO Auto-generated constructor stub
	}
	public void Send(String message) {
		mediator.Send(message, this);
	}
	public void Notify(String message) {
		System.out.println("同事2得到的信息:"+message);
	}
}
//具体中介类
class ConcreteMediator extends Mediator{
	private ConcreteColleague1 colleague1;
	private ConcreteColleague2 colleague2;
	public ConcreteColleague1 getColleague1() {
		return colleague1;
	}

	public void setColleague1(ConcreteColleague1 colleague1) {
		this.colleague1 = colleague1;
	}

	public ConcreteColleague2 getColleague2() {
		return colleague2;
	}

	public void setColleague2(ConcreteColleague2 colleague2) {
		this.colleague2 = colleague2;
	}

	@Override
	public void Send(String message, Colleague colleague) {
		// TODO Auto-generated method stub
		if(colleague==colleague1) {
			colleague2.Notify(message);
		}else {
			colleague1.Notify(message);
		}
	}
	
}
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ConcreteMediator m=new ConcreteMediator();
		ConcreteColleague1 c1=new ConcreteColleague1(m);
		ConcreteColleague2 c2=new ConcreteColleague2(m);
		m.setColleague1(c1);
		m.setColleague2(c2);
		c1.Send("你吃饭了吗?");
		c2.Send("还没呢,你请客不?");
	}

}

中介者模式中,中介者对象定义了整个系统中所有具体同事类之间的关系,处于核心地位。在整个系统中它主要承担两个方面的责任:
1、结构上起到中转作用。通过中介者对象对关系的封装,使得具体的同事类不再需要显示的引用其他对象,通过中介者就可以完成与其他同事类之间的通信。
2、行为上起到协作作用。中介者对同事类之间的关系进行封装,同事类在不需要知道其他对象的情况下通过中介者与其他对象完成通信。在这个过程中同事类不需要指明中介者该如何做,中介者可以根据自身的逻辑进行协调,对同事的请求进一步处理,将同事成员之间的关系行为进行分离和封装。
由于有了Mediator对对象的关系进行了封装,使得ConcreteC olleague1和
C oncreteColleague2在发送消息和接收消息时通过中介者来完成,减
少了同事类之间的耦合度,使得他们可以独立改变和复用。
安理会做中介

//联合国机构
abstract class UnitedNations{
	public abstract void Declare(String message,Country colleague);
}
//国家类
abstract class Country{
	protected UnitedNations mediator;
	public Country(UnitedNations mediator) {
		this.mediator=mediator;
	}
}
class USA extends Country{

	public USA(UnitedNations mediator) {
		super(mediator);
		// TODO Auto-generated constructor stub
	}
	public void Declare(String message) {
		mediator.Declare(message, this);
	}
	public void GetMessage(String message) {
		System.out.println("美方获得对方信息:"+message);
	}
}
class Iraq extends Country{

	public Iraq(UnitedNations mediator) {
		super(mediator);
		// TODO Auto-generated constructor stub
	}
	public void Declare(String message) {
		mediator.Declare(message, this);
	}
	public void GetMessage(String message) {
		System.out.println("伊拉克获得对方信息:"+message);
	}
}
//联合国安全理事会
class UnitedNationsSecurityCouncil extends UnitedNations{
	private USA colleague1;
	private Iraq colleague2;
	public USA getColleague1() {
		return colleague1;
	}

	public void setColleague1(USA colleague1) {
		this.colleague1 = colleague1;
	}

	public Iraq getColleague2() {
		return colleague2;
	}

	public void setColleague2(Iraq colleague2) {
		this.colleague2 = colleague2;
	}

	@Override
	public void Declare(String message, Country colleague) {
		// TODO Auto-generated method stub
		if(colleague==colleague1) {
			colleague2.GetMessage(message);
		}else {
			colleague1.GetMessage(message);
		}
	}
	
}
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		UnitedNationsSecurityCouncil m=new UnitedNationsSecurityCouncil();
		USA c1=new USA(m);
		Iraq c2=new Iraq(m);
		m.setColleague1(c1);
		m.setColleague2(c2);
		c1.Declare("不准研制核武器,否则要发动战争!");
		c2.Declare("我们没有核武器,也不怕侵略。");
	}

}

优点

  • Mediator模式是一种很有用并且很常用的模式,它将对象间的通信封装到一个类中,将多对多的通信转化为一对多的通信,降低了系统的复杂性。
  • Mediator还获得系统解耦的特性,通过Mediator,各个Colleague就不必维护各自通信的对象和通信协议,降低了系统的耦合性,Mediator和 各个Colleague就可以相互独立地修改了。
  • Mediator模式还有一个很显著的特点就是将控制集中,集中的优点就是便于管理,也正符合了OO设计中的每个类的职责要单一和集中的原则。

缺点
控制的集中化把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个C oncreteC olleague都复杂。
门面模式和中介者模式
门面( Facade)模式和中介者(Mediator)模式有着共同的目的。它们都是调配一组相互耦合的对象的通信。

  • 门面模式关注的是这组复杂对象如何与外界通信,
  • 中介者模式是调配这组复杂对象之间的通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值