设计模式之中介者模式

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会设立很多个,同样,在设计中介类的时候也要考虑到这些。

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







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值