设计模式(17)--中介者模式

本文介绍中介者模式的应用原理,展示了如何通过中介者模式简化对象间复杂的交互,避免网状依赖结构,实现系统的松耦合。

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

中介者模式从名字来看不难理解,就是给A和B提供一个中间人,扩展开来说就是如果系统中多个系统交互,如果他们各自为战,自己负责和其他所有对象进行交互,最后会形成一张很复杂的交互网,而中介者模式就是来使这张网变得简单,所有对象不用和其他对象一一交互,全都和中介者这个角色交互。从而形成一个简单的星型结构。

中介者模式引入了中介者角色。

中介者模式和外观模式的区分:中介者模式引入了一个中介者代替对象之间复杂的相互交互,外观模式引入了外观角色来和客户端进行交互。两者的区别是什么呢?如果说从外观模式中的外观角色那里划一条线,客户端在外观角色的左边,那么复杂的中介者模式就在客户端的右边,示意图如下:


中介者模式UML类图:


中介者和同事类相互持有引用

示例代码:

抽象中介者:

/*****
 * 抽象中介者类
 * @author wjw
 *
 */
public abstract class Mediator {
	protected List<Colleague> colleagues = new ArrayList<Colleague>();
	/***
	 * 向中介者中注册同事成员方法
	 */
	public void register(Colleague c){
		colleagues.add(c);
	}
	
	public abstract void method();
}

具体中介者:

/****
 * 具体中介者
 * @author wjw
 *
 */
public class ChangeMediator extends Mediator{

	@Override
	public void method() {
		// TODO Auto-generated method stub
		Iterator iterator = colleagues.iterator();
		while(iterator.hasNext()){
			Colleague colleague = (Colleague)iterator.next();
			colleague.change();
		}
	}

}


抽象同事类:


/*****
 * 抽象同事类
 * 
 * @author wjw
 *
 */
public abstract class Colleague {
	protected Mediator mediator;
	protected  int num;
	public Colleague(Mediator mediator){
		
		this.mediator = mediator;
	}

	
	public  int getNum() {
		return num;
	}




	/****
	 * 与中介者进行通信
	 */
	public void add(){
		mediator.method();
	}
	public abstract void change();
}

具体同事类 A B C:

public class AColleague extends Colleague {
	
	public AColleague(Mediator mediator) {
		super(mediator);
		// TODO Auto-generated constructor stub
		num = (int)'a';
	}

	@Override
	public void change() {
		// TODO Auto-generated method stub
		num++;
	}

}

public class BColleague extends Colleague {

	public BColleague(Mediator mediator) {
		super(mediator);
		// TODO Auto-generated constructor stub
		num = (int)'b';
	}

	@Override
	public void change() {
		// TODO Auto-generated method stub
		num++;
	}

}

public class CColleague extends Colleague {

	


	

	public CColleague(Mediator mediator) {
		super(mediator);
		// TODO Auto-generated constructor stub
		 num = (int)'c';
	}

	@Override
	public void change() {
		// TODO Auto-generated method stub
		num++;
	}

}


Main类:

public class Main {
	public static void main(String[] args) {
		//new中介者对象
		Mediator mediator = new ChangeMediator();
		
		//new 3个同事对象,建立所有同事对象和终结者对象的关联
		Colleague a,b,c;
		a = new AColleague(mediator);
		b = new BColleague(mediator);
		c = new CColleague(mediator);
		
		//向中介者对象中添加同事对象,用于A和BC两个同事通信
		mediator.register(b);
		mediator.register(c);
		
		//查看初始数据(初始数据为abc三个小写字母ascII码)
		System.out.println("A:" + a.getNum() + " B:" + b.getNum() + " C:" + c.getNum());
		a.add();
		System.out.println("A:" + a.getNum() + " B:" + b.getNum() + " C:" + c.getNum());

	}
}

运行结果:

A:97 B:98 C:99
A:97 B:99 C:100


示例程序说明:

该程序演示的是ABC三个同事类一个调用add方法(自身num值不受影响)即影响到其他两个类num值,这里要探讨一下中介者模式的好处,如果不使用中介者模式会怎样,ABC三个类每个类都要保持另外两个类的引用,这样就形成了复杂的网状结构,类与类之间的耦合性太强了。

而使用中介者类呢,ABC三个类只需与中介者类发生关系,类和类只间的耦合性大大降低,十分有利于程序扩展。

在Main方法中,我们将所有类的引用注册到中介者中,中介者依靠这些引用才能与这些对象交互,不注册不参与交互。同时每一个同事类维持一个对中介者的引用,这自然也是为了类与类之间的交互。

通过以上,可知:

中介者模式就是将原来对象与对象之间交互形成的复杂网状结构解耦成为简单的星型结构,这个星型结构的核心就是中介者角色。

如有错误,欢迎指正

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值