GOF对中介者模式的定义是:用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式的互相引用,从而使其耦合松散,二期额可以独立地改变他们之间的交互。
来看看基本代码
/**
*
* @author ricardo
* @Time 下午9:08:52
* @Function:抽象中介类
*
*/
public abstract class Mediator {
public abstract void send(String message,Colleague colleage);
}
/**
*
* @author ricardo
* @Time 下午9:16:57
* @Function:具体的中介
*
*/
public class ConctereMediator extends Mediator {
private ColleagueA colleagueA;
private ColleagueB colleagueB;
@Override
public void send(String message, Colleague colleage) {
if(colleage == colleagueA) {
colleagueB.notify(message);
}else {
colleagueA.notify(message);
}
}
public void setColleagueA(ColleagueA colleagueA) {
this.colleagueA = colleagueA;
}
public void setColleagueB(ColleagueB colleagueB) {
this.colleagueB = colleagueB;
}
}
/**
*
* @author ricardo
* @Time 下午9:10:49
* @Function:抽象同事类
*
*/
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
}
public class ColleagueA extends Colleague {
public ColleagueA(Mediator mediator) {
super(mediator);
}
//转发信息给A同事
public void send(String message) {
mediator.send(message, this);
}
//收到新的消息
public void notify(String message) {
System.out.println("colleague A got a message:" + message);
}
}
public class ColleagueB extends Colleague {
public ColleagueB(Mediator mediator) {
super(mediator);
}
//转发信息给B同事
public void send(String message) {
mediator.send(message, this);
}
//收到新的消息
public void notify(String message) {
System.out.println("colleague B got a message:" + message);
}
}
客户端代码
public class Client {
public static void main(String[] args) {
ConctereMediator conctereMediator = new ConctereMediator();
ColleagueA CA = new ColleagueA(conctereMediator);
ColleagueB CB = new ColleagueB(conctereMediator);
conctereMediator.setColleagueA(CA);
conctereMediator.setColleagueB(CB);
CA.send("hello,i am A");
CB.send("hi,can i help you?");
}
}
运行截图
从中介者模式来看,同事A和B两人是没有任何关系的,能彼此交流的桥梁就是中介者的存在,中介者就像一台服务器,将A的请求发送给B,收到B的回复后再转发给A。
中介者模式很直接的一个现实案例就是客服,我们来模拟下客服的代码
/**
*
* @author ricardo
* @Time 下午9:43:12
* @Function:抽象客服人员
*
*/
public abstract class CustomerServer {
public abstract void communicate(String message,Communicator communicator);
}
客服MM
public class CustomerServerMM extends CustomerServer {
private Customer customer;
private Teahnician technician;
@Override
public void communicate(String message, Communicator communicator) {
if(communicator == customer) {
technician.getMessage(message);
}else {
customer.getMessage(message);
}
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
public void setTechnician(Teahnician technician) {
this.technician = technician;
}
}
抽象的交流者
/**
*
* @author ricardo
* @Time 下午9:43:22
* @Function:抽象交流者
*
*/
public abstract class Communicator {
protected CustomerServer customerServer;
public Communicator(CustomerServer customerServer) {
super();
this.customerServer = customerServer;
}
}
public class Customer extends Communicator {
public Customer(CustomerServer customerServer) {
super(customerServer);
// TODO Auto-generated constructor stub
}
public void Ask(String message) {
// TODO Auto-generated method stub
customerServer.communicate(message, this);
}
public void getMessage(String message) {
// TODO Auto-generated method stub
System.out.println("顾客得到咨询技术人员的回复:" + message);
}
}
技术人员
public class Teahnician extends Communicator {
public Teahnician(CustomerServer customerServer) {
super(customerServer);
// TODO Auto-generated constructor stub
}
public void answer(String message) {
// TODO Auto-generated method stub
customerServer.communicate(message, this);
}
void getMessage(String message) {
// TODO Auto-generated method stub
System.out.println("顾客咨询技术人员:" + message);
}
}
客户端代码
public class Client {
public static void main(String[] args) {
CustomerServerMM mm = new CustomerServerMM();
Customer customer = new Customer(mm);
Teahnician teahnician = new Teahnician(mm);
mm.setCustomer(customer);
mm.setTechnician(teahnician);
customer.Ask("为什么我买的笔记本电脑开不了机了?");
teahnician.answer("请问大胸弟你插电源了么?");
}
}
运行截图
客服MM在技术团队和客户之间充当了一个媒介的作用用于交流沟通,减少了客户与技术人员的耦合,但是同样的,假设功能很多而且繁杂,就会导致这个中介类过于复杂化,所以在现实中,客服MM会设立很多个,同样,在设计中介类的时候也要考虑到这些。
以上内容,整理自刘径舟,张玉华编著的《设计模式其实很简单》读书笔记,欢迎转载