十七、中介者模式Mediator(行为型)

中介对象可以封装一系列的对象交互,它可以使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。在进行面向对象设计时,一般倾向于将系统分割成许多对象,这样可以增加复用性,但是这样做会导致对象的关系会非常复杂。中介者可以将这些集体行为封装起来,充当控制和协调这组对象交互的角色,从而使得这些对象之间不再有显式的相互引用,它们只知道中介者,从而减少了相互连接的数目。

中介者的优缺点很明显,例如它可以减少子类生成,降低各个Colleague之间的耦合度,简化对象协议,协作对象进行抽象,但是它使得控制集中,可能会导致Mediator难以维护。

在控制Colleague和Mediator之间的通信时,常用的方式有两种:一种是使用Observer模式,将Mediator实现为一个Observer,各个Colleague作为Subject,一旦状态改变就发通知给Mediator;另一种是在Mediator中定义一个特殊的通知接口,各个Colleague在通信时直接调用该接口。


public class Colleague {
	private Mediator mediator = null;

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

	public void changed() {
		mediator.doChange(this);
	}
}
public class ConcreteColleague1 extends Colleague{

	public ConcreteColleague1(Mediator mediator) {
		super(mediator);
	}
	
	public void doJob1(){
		System.out.println("Doing Job1...");
	}
}
public class ConcreteColleague2 extends Colleague {
	public ConcreteColleague2(Mediator mediator) {
		super(mediator);
	}
	public void doJob2() {
		System.out.println("Doing Job2...");
	}
}
public interface Mediator {
	public void initalState();
	public void doChange(Colleague colleague);
	public void show();
}
public class ConcreteMediator implements Mediator{

	private ConcreteColleague1 colleague1 = null;
	private ConcreteColleague2 colleague2 = null;
	@Override
	public void initalState() {
		colleague1 = new ConcreteColleague1(this);
		colleague2 = new ConcreteColleague2(this);
	}
	@Override
	public void doChange(Colleague colleague) {
		if(colleague == colleague1){
			colleague1.doJob1();
			System.out.println("Do other changes in mediator");
		} else if(colleague == colleague2){
			colleague2.doJob2();
		}
	}
	@Override
	public void show() {
		colleague1.changed();
		colleague2.changed();
	}
}
public class Client {
	@Test
	public void test(){
		Mediator mediator = new ConcreteMediator();
		mediator.initalState();
		mediator.show();
	}
}

客户端只需要调用Mediator中的方法就可以控制整个系统,Mediator可以将Colleague协调起来,而且每个Colleague的实现类中都包含了对Mediator的引用,这样,当Colleague自身改变时也可以将改变的消息传递给Mediator,从而让Mediator管理所有的Colleague。

这种模式的好处在于它可以将复杂性封装在Mediator内部,并且消除了Colleague之间的依赖关系,但是当Mediator中控制变化的方法复杂性增加时,就会导致许多问题,并抵消这种模式在其他方面带来的好处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值