设计模式-中介者模式

定义

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

设计模式-中介者模式-LMLPHP

组成部分主要包含 Mediator抽象中介角色、ConcreteMediator 具体的中介角色、Colleague 同事(功能)角色

· Mediator 抽象中介角色:定义统一的接口,用于同事角色之间的通信

· ConcreteMediator 具体的中介角色:具体协调各个同事角色的协作行为,它必须依赖被协调的同事角色

· Colleague 同事角色:与其它同事角色通信必须依赖中介者角色,每个同事类角色行为分为两种:
    1,自发行为:改变本身的状态以及处理本身的逻辑,不与任何终结者角色或同事角色交互的行为
    2,依赖行为:必须依赖中介者角色才能完成的行为

优点

减少依赖,把原来一对多的依赖变成了一对一的依赖,降低了耦合,符合迪米特法则,分布式系统中的应用抽象也可以这么做

缺点

  业务复杂之后中介者会膨胀的非常快,如果是在单系统中此时可以拆分为多个应用中介,分布式系统中可以抽出更细力度的中介模型

实现


public abstract class AbstractMediator {

	private Colleague1 colleague1;

	private Colleague2 colleague2;

	public AbstractMediator() {
	}

	public AbstractMediator(Colleague1 colleague1, Colleague2 colleague2) {
		this.colleague1 = colleague1;
		this.colleague2 = colleague2;
	}

	protected Colleague1 getColleague1() {
		return colleague1;
	}

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

	protected Colleague2 getColleague2() {
		return colleague2;
	}

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

	public abstract void doSomeThing1();

	public abstract void doSomeThing2();

}


public class ConcreteMediator extends AbstractMediator {

	public ConcreteMediator() {
		super();
	}

	public ConcreteMediator(Colleague1 colleague1, Colleague2 colleague2) {
		super(colleague1, colleague2);
	}

	@Override
	public void doSomeThing1() {
		this.getColleague1().doSomething1();
	}

	@Override
	public void doSomeThing2() {
		this.getColleague2().doSomeThing2();
	}
}

public class Colleague1 {

	private AbstractMediator abstractMediator;

	public Colleague1(AbstractMediator abstractMediator){
		this.abstractMediator = abstractMediator;
	}

	public void doSomething1(){
		System.out.println("同事1完成的事1");
	}

	public void doSomeThingNeedAssist(){
		System.out.println("同事1处理需要中介协助的事情");
		this.abstractMediator.doSomeThing2();
	}



}


public class Colleague2 {

	private AbstractMediator abstractMediator;

	public Colleague2(AbstractMediator abstractMediator) {
		this.abstractMediator = abstractMediator;
	}

	public void doSomeThing2(){
		System.out.println("同事2完成事2");
	}

	public void doSomeThingNeedAssist(){
		System.out.println("同事2处理需要中介协助的事情");
		this.abstractMediator.doSomeThing1();
	}
}


public class Client {

	public static void main(String[] args) {
		AbstractMediator abstractMediator = new ConcreteMediator();
		Colleague1 colleague1 = new Colleague1(abstractMediator);
		Colleague2 colleague2 = new Colleague2(abstractMediator);
		abstractMediator.setColleague1(colleague1);
		abstractMediator.setColleague2(colleague2);


		colleague1.doSomeThingNeedAssist();

//		colleague2.doSomeThingNeedAssist();
	}
}

扩展

使用场景

如果只是简单的一个对象依赖多个对象就考虑采用中介者模式的话,很有可能造成中介者模式的实现非常复杂,而且只是逻辑转移到
中介者身上的情况下,未必能把原有的负责逻辑理清楚。

中介者模式使用于多个对象紧密耦合的情况。那紧密耦合的标准是什么?
如果在类图中出现了蜘蛛网的结构。
在这种情况下一定要采用中介者模式,把原本的网状结构梳理成星状结构,使原本负责的逻辑关系变得清晰。

常见应用

  • 机场调度中心
  • MVC框架
  • 中介服务
12-08 11:12