设计模式之中介者模式

来源:互联网 发布:中国网络经纪人客户端 编辑:程序博客网 时间:2024/05/18 08:13

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;@Overridepublic 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;@Overridepublic 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 stubcustomerServer.communicate(message, this);}public void getMessage(String message) {// TODO Auto-generated method stubSystem.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 stubcustomerServer.communicate(message, this);}void getMessage(String message) {// TODO Auto-generated method stubSystem.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会设立很多个,同样,在设计中介类的时候也要考虑到这些。

以上内容,整理自刘径舟,张玉华编著的《设计模式其实很简单》读书笔记,欢迎转载







原创粉丝点击