设计模式(Java随笔)—中介者模式

中介者模式(Mediator Pattern):也叫调停者模式,是一种比较简单的模式,用于管理很多的对象的相互作用,以至于使这些对象可以专注于自身的行为,中介者模式很容易在系统中使用,也很容易误用。

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

中介者模式的四个角色:

  • 抽象中介者(Mediator)角色:定义同事对象到中介者对象的统一接口,用于各同事角色之间的通信
  • 具体中介者(Concrete Mediator)角色:实现抽象中介者,依赖所有的具体同事
  • 抽象同事(Colleague)角色:定义中介者对象到同事对象的统一接口,同事对象只知道中介者对象而不知道其他同事对象
  • 具体同事(Concrete Colleague)角色:实现抽象同事,每个具体同事只知道自己在小范围的行为,而不知道大范围的目的

优点:减少了同事类之间的耦合,使任一个同事类都可以只专注于自身的行为,且不会影响到其他同事类,对各个同事类之间的交互通信进行了集中。

缺点:正是由于对所有同事类的集中管理,使得中介者类比任意一个具体同事类都要复杂。

中介者模式基础代码实现:

import java.util.Date;

public class MediatorModel {
	/*
	 * 中介者模式 
	 */
	public static void main(String[] args) {
		//创建中介
		ConcreteMediator mediator=new ConcreteMediator();
		//将所有同事名单列出
		Colleague A=new ConcreteColleagueA(mediator);
		Colleague B=new ConcreteColleagueB(mediator);
		//将同事名单告知中介
		mediator.setColleagueA(A);
		mediator.setColleagueB(B);
		//同事向中介发送请求
		A.sendToMediator("你好,我是你的同事A");
		B.sendToMediator("你好,我是你的同事B");
	}
}

//抽象中介者
abstract class Mediator{
	//转发消息
	public abstract void send(Colleague colleague,String msg);
}

//抽象同事
abstract class Colleague{
	protected Mediator mediator;
	public Colleague(Mediator mediator) {
		this.mediator=mediator;
	}
	//发送消息
	public void sendToMediator(String msg) {
		mediator.send(this,msg);
	}
	//由具体同事处理接收到的消息 
	public abstract void receive(String msg);
}



//具体中介者
class ConcreteMediator extends Mediator{
	//准备好所有具体同事的引用
	private Colleague A;
	private Colleague B;
	//
	public void setColleagueA(Colleague A) {
		this.A=A;
	}
	public void setColleagueB(Colleague B) {
		this.B=B;
	}
	
	@Override
	public void send(Colleague colleague, String msg) {
		Colleague tocolleague=null;
		if(colleague==A) {
			tocolleague=B;
		}else if(colleague==B){
			tocolleague=A;
		}
		System.out.println("日志:"+colleague.getClass()+" 发送一条消息给 "+tocolleague.getClass()+" 内容:"+msg+" 时间:"+(new Date()));
		tocolleague.receive(msg);
	}
}

//具体同事
class ConcreteColleagueA extends Colleague{
	public ConcreteColleagueA(Mediator mediator) {
		super(mediator);
	}

	@Override
	public void receive(String msg) {
		System.out.println("A接收到一条消息:"+msg);
	}
}
class ConcreteColleagueB extends Colleague{
	public ConcreteColleagueB(Mediator mediator) {
		super(mediator);
	}

	@Override
	public void receive(String msg) {
		System.out.println("B接收到一条消息:"+msg);
	}
}

运行结果:

日志:class com.nie.designmode.ConcreteColleagueA 发送一条消息给 class com.nie.designmode.ConcreteColleagueB 内容:你好,我是你的同事A 时间:Sat Oct 27 21:25:28 CST 2018
B接收到一条消息:你好,我是你的同事A
日志:class com.nie.designmode.ConcreteColleagueB 发送一条消息给 class com.nie.designmode.ConcreteColleagueA 内容:你好,我是你的同事B 时间:Sat Oct 27 21:25:28 CST 2018
A接收到一条消息:你好,我是你的同事B

参考资料:

《大话设计模式》——程杰

《设计模式(Java版)》

你可能感兴趣的:(设计模式)