中介者模式(Mediator):用一个中介者对象来封装一系列的对象交互。中介者使得各个对象不需要显式的相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互。
简单场景:两个同事通过中介者相互通讯。
Mediator:抽象中介者,定义了同事对象带中介者对象的接口。
Colleague:抽象同事类。
ConcreteMediator:具体中介者对象,实现抽象中介者的方法,他需要知道具体同事类,并从具体同事类接受消息,向具体同事类发出消息。
ConcreteColleague_1:具体同事类1只知道自己的行为,而不了解其他具体同事的情况,但是他们都认识中介者对象。
ConcreteColleague_2:具体同事类2只知道自己的行为,而不了解其他具体同事的情况,但是他们都认识中介者对象。
下面看具体实现的代码:
Mediator:抽象中介者
package com.tian.mdeiator;
/**
* @author 作者 : TianLuhua
* @version 创建时间:2016年4月20日 下午11:16:18 抽象中介者
*/
public abstract class Mediator {
//发送消息的抽象方法,具体的同事类调用该方法来向其他同事发送消息
public abstract void send(String name, Colleague colleague);
//认识同事类的方法
public abstract void setColleague(Colleague colleague);
}
Colleague:抽象同事类
package com.tian.mdeiator;
/**
* @author 作者 : TianLuhua
* @version 创建时间:2016年4月20日 下午11:17:24
* 抽象同事类
*/
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
//让具体同事类认识中介者
this.mediator = mediator;
//在具体同事类认识中介者的同时,也让中介者认识具体的同事类。便于传递消息
mediator.setColleague(this);
}
//发送消息的抽象方法
abstract void send(String message);
//接受消息的抽象方法
abstract void notify(String message);
}
ConcreteMediator:具体中介者
package com.tian.mdeiator;
/**
* @author 作者 : TianLuhua
* @version 创建时间:2016年4月20日 下午11:19:31 具体中介者类
*/
public class ConcreteMediator extends Mediator {
//具体的同事类 1
private ConreteColleague_1 colleague_1;
<pre name="code" class="java"> //具体的同事类 2
private ConreteColleague_2 colleague_2;
//Colleague 作为参数进来就好比中介者需让认识具体的同事类,然后盘对是那个具体的同事类,在将其的消息给到他,@Overridepublic void send(String message, Colleague colleague) {if (colleague == colleague_1) {colleague_2.notify(message);} else {colleague_1.notify(message);}} @Overridepublic void setColleague(Colleague colleague) {if (colleague instanceof ConreteColleague_1) {colleague_1 = (ConreteColleague_1) colleague;} else {colleague_2 = (ConreteColleague_2) colleague;}}}
ConreteColleague_1:具体同事类 1
package com.tian.mdeiator;
/**
* @author 作者 : TianLuhua
* @version 创建时间:2016年4月20日 下午11:20:45
*
*/
public class ConreteColleague_1 extends Colleague {
public ConreteColleague_1(Mediator mediator) {
super(mediator);
}
@Override
void send(String message) {
<pre name="code" class="java"> //具体同事类发送消息是通过中介者的send方法来发送消息的
mediator.send(message, this);}@Overridevoid notify(String message) {System.out.println("得到同事2信息:" + message);}}
ConreteColleague_2:具体同事类 2
package com.tian.mdeiator;
/**
* @author 作者 : TianLuhua
* @version 创建时间:2016年4月20日 下午11:21:15
*
*/
public class ConreteColleague_2 extends Colleague {
public ConreteColleague_2(Mediator mediator) {
super(mediator);
}
@Override
void send(String message) {
//具体同事类发送消息是通过中介者的send方法来发送消息的
mediator.send(message, this);
}
@Override
void notify(String message) {
System.out.println("得到同事1信息:" + message);
}
}
客户端调用:
package com.tian.mdeiator;
/**
* @author 作者 : TianLuhua
* @version 创建时间:2016年4月20日 下午11:28:14 客户端
*/
public class Main {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConreteColleague_1 colleague_1 = new ConreteColleague_1(mediator);
ConreteColleague_2 colleague_2 = new ConreteColleague_2(mediator);
colleague_1.send("你吃饭了吗?");
colleague_2.send("还没呢!你准备请客吗?");
}
}
打印结果:
得到同事1信息:你吃饭了吗?
得到同事2信息:还没呢!你准备请客吗?
怎么样看懂了吗?
最好的将简单的代码动手敲一遍,加深印象。