中介者模式小试(一)

2014-11-23 22:54:41 · 作者: · 浏览: 0
中介者模式是一个设计模式中非常重要的一个模式,是我们模块设计中经常会用到的。
一、介绍
那么什么是中介者模式呢?
《研磨设计模式》中有这样的定义——用一个中介对象来封装一系列的对象交互。中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互。
中介者模式的本质是——封装交互。
前面学过外观模式,外观模式的本质是“封装交互,简化调用”,那么中介者模式和外观模式有什么区别呢?
外观模式是用来封装子系统之间的各个模块,向子系统外部提供简单易用的接口。就是说,外观模式封装子系统之间的交互是为了让外部系统调用的时候更加方便,交互的方向是单项的。而中介者模式是纯粹为了简化各个内部模块之间,多向的交互。
二、我的实现:
中介者模式是怎么实现的呢?
假设有这样的需求,要模拟当当网的整个送货流程。有这样几点要求:
1、主要有顾客、当当网、取货中心、送货中心、快递员这样几个模块。
2、其中,顾客下订单、取货中心取货、送货中心送货、快递员送货这几个行为结束之后,都必须通知当当网,以便顾客随时获取信息。
3、另外还有一个实体类——订单。
这里,由于各个模块之间进行交互,可以把当当网作为我们的中介者。这里是我自己的大体实现:
1、首先是订单实体类:
复制代码
//订单类,实体Bean
public class Order {
// 联系人信息
private String personInfomation;
// 送货地址
private String address;
// 商品列表
private String productList;
//Get Set方法省略
}
复制代码
2、其次,做了一个抽象类,以便扩展,有一个通知当当网的方法,其他需要通知当当网的类都继承这个类。
复制代码
public abstract class Notice {
// 通知Dangdang的方法
public void noticeDangdang(Notice notice) {
//Dangdang的处理消息的方法。
Dangdang.getInstance().executeNotice(notice);
}
}
复制代码
3、然后就是顾客类,继承了Notice类,如下:
复制代码
public class Customer extends Notice{
private Order order;
public Order getOrder() {
return order;
}
public void sendOrder(Order order) {
this.order = order;
//通知当当
noticeDangdang(this);
}
}
复制代码
4、取货中心:
复制代码
//取货中心,设置为单例
public class GetProductsCenter extends Notice {
private static GetProductsCenter center = new GetProductsCenter();
public static GetProductsCenter getInstance(){
return center;
}
// 取货
public void getProduct(Order order) {
System.out.println("从仓库取得" + order.getProductList());
// 通知当当
noticeDangdang(this);
}
}
复制代码
5、送货中心:
复制代码
import java.util.LinkedList;
//送货中心,设置为单例
public class SendProductsCenter extends Notice {
private static SendProductsCenter center = new SendProductsCenter();
public static SendProductsCenter getInstance(){
return center;
}
// 同步的送货人列表,这里真正实现时,应该与 数据库交互
public LinkedList deliveryManList = new LinkedList();
public void addDeliveryMan(DeliveryMan deliveryMan) {
deliveryManList.push(deliveryMan);
}
private DeliveryMan getDeliveryMan() {
return deliveryManList.poll();
}
// 送货人去送货
public void sendProducts(Order order) {
init();
DeliveryMan deliveryMan= getDeliveryMan();
//通知当当
noticeDangdang(this);
deliveryMan.findCustomerAndSendProducts(order);
}
public void init(){
DeliveryMan man= new DeliveryMan();
addDeliveryMan(man);
}
}
复制代码
6、送货员:
public class DeliveryMan extends Notice {
复制代码
private String deliveryManName = "张三";
public String getDeliveryManName() {
return deliveryManName;
}
public void setDeliveryManName(String deliveryManName) {
this.deliveryManName = deliveryManName;
}
// 找到顾客并送货
publ