设计模式——中介者模式
1、中介者模式的定义
中介者模式:在实际应用中可能会遇到这样的问题,有多个对象且对象彼此相互影响,它们的关系是网状的,如果按照一般的处理方式来处理的话就会很麻烦且不易扩展。此时就需要使用一个相当于仲裁者的对象来处理对象之间的关系,即对象之和仲裁者发生关系而彼此之间不再发生关系,这样就将原本的网状关系解耦成松散的中心状关系,这样就会提高扩展性且对象之间的关系更加清晰,使用这种方式来解耦多个对象间关系的模式就叫中介者模式也就仲裁者模式!如下图所示:小圆表示同事对象,大圆表示中介者,连线表示对象间的关系
从图中直观的感受可以看出多个对象之间的关系变得清晰了,但是需要引入一个仲裁者对象,这个对象负责处理多个对象间的关系!
No BB,Show Code!
2、实现代码
2-1定义中介者接口
定义一个中介者接口,接口中定义中介者对象和同事对象的关系!代码如下:
package designPattern.test.mediator;
/**
* 中介者接口
*/
public interface Mediator {
//接收消息方法
void receiveMsg(Colleague sender, String msg);
//发送消息方法
void sendMsg(Colleague receiver, String msg);
}
2-2定义抽象同事类
同事类就是图中小圆表示的对象!代码如下:
package designPattern.test.mediator;
/**
* 抽象同事类
*/
public abstract class Colleague {
private Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
public Mediator getMediator() {
return mediator;
}
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public abstract void sendMsg(String msg);
public abstract void execute(String msg);
}
2-3定义具体同事类
为了便于理解中介者模式,定义了HRDepartment,DevDepartment,MarketDepartment,FinanDepartment表示4个具体的同事类,分别表示公司的人力资源部、研发部、市场部和财务部,具体代码如下:
HRDepartment:
package designPattern.test.mediator;
/**
* 人力资源部
*/
public class HRDepartment extends Colleague {
public HRDepartment(Mediator mediator) {
super(mediator);
}
@Override
public void sendMsg(String msg) {
System.out.println("HRDepartment send:" + msg);
}
@Override
public void execute(String msg) {
System.out.println("HRDepartment execute:" + msg);
}
public String toString() {
return "HRDepartment";
}
}
DevDepartment:
package designPattern.test.mediator;
/**
* 研发部
*/
public class DevDepartment extends Colleague {
public DevDepartment(Mediator mediator) {
super(mediator);
}
@Override
public void sendMsg(String msg) {
System.out.println("DevDepartment send:" + msg);
}
@Override
public void execute(String msg) {
System.out.println("DevDepartment execute:" + msg);
}
public String toString() {
return "DevDepartment";
}
}
MarketDepartment:
package designPattern.test.mediator;
/**
* 市场部
*/
public class MarketDepartment extends Colleague {
public MarketDepartment(Mediator mediator) {
super(mediator);
}
@Override
public void sendMsg(String msg) {
System.out.println("MarketDepartment send:" + msg);
}
@Override
public void execute(String msg) {
System.out.println("MarketDepartment execute:" + msg);
}
public String toString() {
return "MarketDepartment";
}
}
FinanDepartment:
package designPattern.test.mediator;
/**
* 财务部
*/
public class FinanDepartment extends Colleague {
public FinanDepartment(Mediator mediator) {
super(mediator);
}
@Override
public void sendMsg(String msg) {
System.out.println("FinanDepartment send" + msg);
}
@Override
public void execute(String msg) {
System.out.println("FinanDepartment execute" + msg);
}
public String toString() {
return "FinanDepartment";
}
}
2-4定义具体中介者类
定义Boss类表示具体的中介者,代码如下:将多个具体的同事类放入具体的中介者类中统一管理
package designPattern.test.mediator;
/**
* 大老板就是中介者
*/
public class Boss implements Mediator {
private HRDepartment hrDepartment;
private DevDepartment devDepartment;
private MarketDepartment marketDepartment;
private FinanDepartment finanDepartment;
public HRDepartment getHrDepartment() {
return hrDepartment;
}
public void setHrDepartment(HRDepartment hrDepartment) {
this.hrDepartment = hrDepartment;
}
public DevDepartment getDevDepartment() {
return devDepartment;
}
public void setDevDepartment(DevDepartment devDepartment) {
this.devDepartment = devDepartment;
}
public MarketDepartment getMarketDepartment() {
return marketDepartment;
}
public void setMarketDepartment(MarketDepartment marketDepartment) {
this.marketDepartment = marketDepartment;
}
public FinanDepartment getFinanDepartment() {
return finanDepartment;
}
public void setFinanDepartment(FinanDepartment finanDepartment) {
this.finanDepartment = finanDepartment;
}
@Override
public void receiveMsg(Colleague sender, String msg) {
System.out.println("同事:" + sender.toString() + "发送消息:" + msg);
sender.sendMsg(msg);
}
@Override
public void sendMsg(Colleague receiver, String msg) {
System.out.println("同事:" + receiver.toString() + "执行消息:" + msg);
receiver.execute(msg);
}
}
3-测试
测试代码如下:
package designPattern.test.mediator;
import org.junit.Test;
/**
* 测试中介者模式
*/
public class MediatorTest {
@Test
public void testMediator() {
Boss boss = new Boss();
DevDepartment devDepartment = new DevDepartment(boss);
boss.setDevDepartment(devDepartment);
HRDepartment hrDepartment = new HRDepartment(boss);
boss.setHrDepartment(hrDepartment);
MarketDepartment marketDepartment = new MarketDepartment(boss);
boss.setMarketDepartment(marketDepartment);
FinanDepartment finanDepartment = new FinanDepartment(boss);
boss.setFinanDepartment(finanDepartment);
boss.receiveMsg(devDepartment,"研发部需要加人");
boss.sendMsg(hrDepartment,"研发部需要加人");
boss.receiveMsg(hrDepartment,"发布招聘公告,招研发");
boss.sendMsg(finanDepartment,"准备工资");
}
}
打印结果:
同事:DevDepartment发送消息:研发部需要加人
DevDepartment send:研发部需要加人
同事:HRDepartment执行消息:研发部需要加人
HRDepartment execute:研发部需要加人
同事:HRDepartment发送消息:发布招聘公告,招研发
HRDepartment send:发布招聘公告,招研发
同事:FinanDepartment执行消息:准备工资
FinanDepartment execute准备工资
此时,同事对象间的交互关系就被中介者和同事间的关系取代了!如果需要添加新的同事就不会影响到之前的逻辑了,易于维护!
总结:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互!