观察者模式 粗浅地说就是作了两件事java
1,当当前被关注的事件发生时它的观注者会被通知到设计模式
2,避免通知动做与关注者的硬性绑定,要进行解耦ide
这是观察者模式的本质思路,不该被其余过多的硬性的准确的描述所干扰。this
仍是以具体的业务作为切入点来理解观察者模式设计
在拣货完成要进行出库时,会简略作如下几个动做好比code
1,修改出库单据的状态server
2,通知服务(ERP)系统,仓储要出库了对象
3,通知客户(实际上要调用好比短信接口等)拣货出库了blog
3,通知WMS(仓储系统)要出库扣减库存了接口
从以上看出,除了要修改单据外。有三个业务要被通知到,那么我就能够对这三个业务进行抽象,使其成为观察者。
那么先设计顶层的接口
package observer;
import bean.PickDoc;
/**
*/
public interface IStockOutNotify {
//通知修改
public void nodify(PickDoc pickDoc);
}
这里就抽象出一个共同的接口,nodify方法,告诉这些系统哪一个单据出库了。由这些系统本身去查找对应的客户与库存,进行记帐,扣减库存,通知客户的操做。
而后抽出三个业务观注者
package observer;
import bean.PickDoc;
/**
*/
public class ServerStockOutNotify implements IStockOutNotify{
@Override
public void nodify(PickDoc pickDoc) {
System.out.print("向服务发送拣货出库通知");
}
}
package observer;
import bean.PickDoc;
/**
*/
public class CustomerStockOutNotify implements IStockOutNotify {
@Override
public void nodify(PickDoc pickDoc) {
System.out.print("向客户发送拣货出库通知");
}
}
package observer;
import bean.PickDoc;
/**
*/
public class WmsStockOutNotify implements IStockOutNotify {
@Override
public void nodify(PickDoc pickDoc) {
System.out.print("向库存系统发送拣货出库通知");
}
}
这样业务关注者的设计就完毕了。下边是通知者的实现
通知者要包含如下几部分功能
1,接受而且保存要被通知的业务关注对象
2,要能接收外部通知它的修改
3,要将修改的动做与通知关联起来,当发生指定的修改时对指定的业务关注者进行通知
那么据此进行如下的实现
package observer;
import java.util.ArrayList;
import java.util.List;
import bean.PickDoc;
public class StockOutNotify{
private List<IStockOutNotify> list = new ArrayList<IStockOutNotify>(); private PickDoc pickDoc; //插入要通知的观察者 public void addNotifyObject(IStockOutNotify stockOutNotify) { list.add(stockOutNotify); } //出库修改出库单 public void updatePickDocStatus(PickDoc pickDoc) { this.pickDoc = pickDoc; notifyAll(pickDoc); } //通知全部要通知到的业务部门 private void notifyAll(PickDoc pickDoc) { for(IStockOutNotify stockOutNotify:list) { stockOutNotify.nodify(pickDoc); } }
}
//最后进行示例调用
package observer;
import bean.PickDoc;
public class StockOutNotifyMain {
public static void main(String[] args) { //声明客户对出库的监听 IStockOutNotify customerStockOutNotify = new CustomerStockOutNotify(); //声明服务对出库的监听 IStockOutNotify serverStockOutNotify = new ServerStockOutNotify(); //声明WMS对出库的监听 IStockOutNotify wmsStockOutNotify = new WmsStockOutNotify(); StockOutNotify stockOutNotify = new StockOutNotify(); //增长对客户的通知 stockOutNotify.addNotifyObject(customerStockOutNotify); //增长对服务的通知 stockOutNotify.addNotifyObject(serverStockOutNotify); //增长对WMS系统的通知 stockOutNotify.addNotifyObject(wmsStockOutNotify); //拣货出库单 PickDoc pickDoc = new PickDoc(); stockOutNotify.updatePickDocStatus(pickDoc); }
}
输出的效果