中介者模式


首先说一下中介者模式的作用,再详细解说,简单的说就是一大堆类相互彼此依赖调用多对多关系,形成了网状的结构,通过中介者,各个业务类依赖中介者可以形成一对一的依赖,减少了依赖降低了类间的耦合。

中介者模式的定义:

用一个中介对象封装一系列的对象交互,中介者使各个对象不需要显示地相互调用,从而其耦合松散,而且可以独立地改变他们之间的交互。

通用类图如下:

从类图中可以看出,中介者模式需要三个角色:

  • Mediator抽象中介者角色:

             抽象中介者角色定义统一的接口,用于各同事角色之间的通信。

  • Concrete Mediator 具体中介者角色

           具体中介者角色通过协调各同事角色实现协作行为,因此它必须依赖与各个同事角色。

  • Colleague 同事角色

          每一个同事角色都知道中介者角色,在与其它同事角色通信的时候通过中介者角色协作。

中介中模式实现:

举一个很简单的例子,我们经常会做些数据交互的工作,比如我们开发了三个子系统,系统A,系统B,系统C。然后这个三个系统都是有关联的需要各自传入数据,现实中很多,我们开发一个系统接入数据或者给其它系统提供数据是很常有的事,如果各个系统直接交互会是什么样子呢,我用下面用例图实现一下:

这是一个蜘蛛网的结构,你看到后爽吗,如果再增加一个系统呢,酱紫让人怎么开发,维护。这种情况就适合用中介者模式,子系统全部中介者:




加入一个中介者作为三个各个模块的交流中心,咱们一般都称为调度,各个模块直接不再交互,交流通过中介者进行。

现在看看例子代码实现:

创建两个子系统System1 与System2 假设有两个业务 A和B

抽象中介者:

package design.mediator;

/**
 * 抽象中介者
 * @author yanwenfei
 */
public abstract class AbstractMediator {

	public System1 sys1;
	public System2 sys2;
	
	public AbstractMediator() {
		sys1 = new System1(this);
		sys2 = new System2(this);
	}
	
	//处理多个对象之间的关系
	public abstract void execute(String str, String sys);
}

具体中介者:

package design.mediator;

/**
 * 具体抽象中介者角色
 */
public class Mediator extends AbstractMediator {

	@Override
	public void execute(String str, String sys) {
		if(str.equals("A")){
			this.doThings1(sys);
		}else if(str.equals("B")){
			this.doThings2(sys);
		}
	}
	
	//业务1
	public void doThings1(String str){
		this.sys1.system1Method1(str);
		this.sys2.system2Method2(str);
	}
	
	//业务2
	public void doThings2(String str){
		this.sys2.system2Method2(str);
		this.sys1.system1Method1(str);
		
	}

}

抽象子系统:

package design.mediator;

/**
 * 抽象子系统
 * @author yanwenfei
 */
public abstract class AbstractColleague {

	protected AbstractMediator mediator;
	
	public AbstractColleague(AbstractMediator mediator) {
		this.mediator = mediator;
	}
}

具体子系统:

package design.mediator;

public class System1 extends AbstractColleague {

	public System1(AbstractMediator mediator) {
		super(mediator);
	}

	//自身功能
	public void system1Method1(String str){
		System.out.println("system1, 调用者:"+str);
	}
	
	//业务一
	public void doThings1(String str){
		super.mediator.execute("A", str);
	}
}

package design.mediator;

public class System2 extends AbstractColleague{

	public System2(AbstractMediator mediator) {
		super(mediator);
	}
	
	public void system2Method2(String str){
		System.out.println("system2, 调用者:"+str);
	}
	
	public void doThings2(String str){
		super.mediator.execute("B", str);
	}
}

测试类:

package design.mediator;

public class TestMain {

	public static void main(String[] args) {
		AbstractMediator mediator = new Mediator();
		System1 sys1 = new System1(mediator);
		sys1.doThings1("业务一");
		System2 sys2 = new System2(mediator);
		sys2.doThings2("业务二");
	}
}
执行结果:

system1, 调用者:业务一
system2, 调用者:业务一
system2, 调用者:业务二
system1, 调用者:业务二
代码写完了,从以上类发现,子系统System1 与 System2 里面的业务不需要直接相互调用,而是通过构造函数传入的中介者去调用,将具体复杂的业务让中介者实现。

中介者模式优点:

减少类间的依赖,把原有的一对多的依赖变成了一对一的依赖。比如struts的MVC 这个很明显了 里面的C就充当了中介者,将jsp与业务逻辑分离。

中介者模式缺点

中介者会膨胀的很大,而且逻辑复杂,子系统越多,中介者的逻辑就越复杂。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值