Java设计模式之中介模式

前言

对于那些对象之间存在复杂交互关心的系统,中介者模式提供了 一种简化复杂交互的解决方案,它通过引入中介者将原本对象之间的两两交互转化为每个对象与中介者之间的交互,中介者可以对对象之间的通信进行控制与协调,降低原有系统的耦合度,使得系统更加灵活,也更易于扩展。

正文

如果在一个系统中对象之间存在多对多的相互关系,可以将对象之间的一些交互行为从各个对象中分离出来,集中封装在一个中介者对象中,并由该中介者进行统一协调,这样对象之间多对多的复杂关系就转化为相对简单的一对多关系。

一、定义

定义如下:

中介者模式: 定义一个对象来封装一系列对象的交互。中介者模式使各对象之间不需要显式的相互引用,
从而使其耦合松散,而且用户可以独立地改变它们之间的交互。
Mediator Pattern: Define an object that encapsulates how a set of objects interact.Mediator loose
coupling by keeping objects from referring to each other explicitly,and it lets you vary their
interaction independently.

中介者模式又称为调停者模式,它是一种对象行为型模式。在中介者模式中,通过引入中介者来简化对象之间的复杂交互,中介者模式是迪米特法则的典型应用。

二、结构

中介者模式包含以下4个角色:
(1)Mediator(抽象中介者):它定义一个接口,该接口用于与各同事对象之间进行通信。
(2)ConcreteMediator(具体中介者):它是抽象中介者的子类,通过协调各个同事对象来实现协作行为,它维持了对各个同事对象的引用。
(3)Colleague(抽象同事类):它定义各个同事类公有的方法,并声明了一些抽象方法供子类实现,同时它维持了一个对抽象中介者类的引用,其子类可以通过该引用与中介者通信。
(4)ConcreteColleague(具体同事类):它是抽象同事类的子类,每一个同事对象在需要和其他同事对象通信时先与中介者通信,通过中介者间接完成与其他同事类的通信;在具体同事类中实现了在抽象同事类中声明的抽象方法。

三、实现

中介者模式的核心在于中介者类的引入,中介者类承担了两个方面的职责:
(1)中转作用(结构性):通过中介者提供的中转作用,各个同事对象不需要显式的引用其他同事,当需要和其他同事进行通信时可通过中介者实现间接调用。该中转作用属于中介者在结构上的支持。
(2)协调作用(行为性):中介者可以更进一步地对同事之间的关系进行封装,同事可以一致地和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装。该协调作用属于中介者在行为上的支持。
典型的抽象中介者类代码如下:

public abstract class Mediator{
	priotected ArrayList<Colleague> colleagues = new ArrayList<Colleague>();	//用于存储同事对象

	//注册方法,用于增加同事对象
	public void register(Colleague colleague){
		colleagues.add(colleague);
	}

	//声明抽象的业务方法
	public abstract void operation();
}

具体中介者类代码如下:

public class ConcreteMediator extends mediator{
	//实现业务方法,封装同事之间的调用
	public void operation(){
		...
		((Colleague)(colleagues.get(0))).method1();	//通过中介者调用同事类的方法
	}
}

在调用同事类方法时可以增加一些自己的业务代码对调用进行控制。
典型的抽象同事类代码如下:

public abstract class Colleague{
	protected Mediator mediator;		//维持一个抽象中介者的引用

	public Colleague(Mediator mediator){
		this.mediator = mediator;
	}

	public abstract void method1();		//声明自身方法,处理自己的行为

	//定义依赖方法,与中介者进行通信
	public void method2(){
		mediator.operation();
	}
}

具体同事类,典型代码如下:

public class ConcreteColleague extends Colleague{
	public ConcreteColleague(Mediator mediator){
		super(mediator);
	}
	
	//实现自身方法
	public void method1(){
		...
	}
		
}

四、扩展中介者与同事类

在中介者模式的实际使用过程中,如果需要引入新的具体同事类,只需要继承抽象同事类并实现其中的方法即可,由于具体同事类之间并无直接的引用关系,因此原有所有同事类无须进行任何修改,它们与新增同事对象之间的交互可以通过修改或者增加具体中介者类来实现;如果需要在原有系统中增加新的具体中介者类,只需要继承抽象中介者类(或已有的具体中介者类)并覆盖其中定义的方法即可,在新的具体中介者中可以通过不同的方式处理对象之间的交互,也可以增加对新增同事的引用和调用。在客户端中只需要修改少许代码(如果引入配置文件就不用修改任何代码)就可以实现中介者类的更换。

五、中介者模式优缺点与适用环境

优点

(1)中介者模式简化了对象之间的交互,它用中介者和同事的一对多交互代替了原来同事之间的多对多交互,一对多关系更容易理解、维护和扩展,将原本难以理解的网状结构转换成相对简单的星形结构。
(2)可将各同事对象解耦。中介者有利于各同事之间的松耦合,可以独立地改变和复用每一个同事和中介者,增加新的中介者类和新的同事类都比较方便,更好地符合开闭原则。
(3)可以减少子类生成,中介者将原本分布于多个对象间的行为集中在一起,改变这些行为只需生成新的中介者子类即可,这使得各个同事类可以被重用,无须直接对同事类进行扩展。

缺点

在具体中介者类中包含了大量同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。

适用环境

(1)系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解。
(2)一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。
(3)想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类,此时可以通过引入中介者类来实现,在中介者中定义对象交互的公共行为,如果需要改变行为则可以增加新的具体中介者类。

以上文字,大量摘抄自《Java设计模式》一书,由刘伟老师编著,故本文应当列入转载一类,有兴趣的朋友可以直接阅读原书。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值