观察者模式 粗浅地说就是做了两件事
1,当当前被关注的事件发生时它的观注者会被通知到
2,避免通知动作与关注者的硬性绑定,要进行解耦
这是观察者模式的本质思路,不应被其他过多的硬性的准确的描述所干扰。
还是以具体的业务做为切入点来理解观察者模式
在拣货完成要进行出库时,会简略做以下几个动作比如
1,修改出库单据的状态
2,通知服务(ERP)系统,仓储要出库了
3,通知客户(实际上要调用比如短信接口等)拣货出库了
3,通知WMS(仓储系统)要出库扣减库存了
从以上看出,除了要修改单据外。有三个业务要被通知到,那么我就可以对这三个业务进行抽象,使其成为观察者。
那么先设计顶层的接口
package observer;
import bean.PickDoc;
/**
- 通知的实现接口
- @author zhousjmas@hotmail.com
-
*/
public interface IStockOutNotify {//通知修改
public void nodify(PickDoc pickDoc);
}
这里就抽象出一个共同的接口,nodify方法,告诉这些系统哪个单据出库了。由这些系统自己去查找对应的客户与库存,进行记账,扣减库存,通知客户的操作。
然后抽出三个业务观注者
package observer;
import bean.PickDoc;
/**
- 通知服务已拣货出库
- @author zhousjmas@hotmail.com
-
*/
public class ServerStockOutNotify implements IStockOutNotify{@Override
public void nodify(PickDoc pickDoc) {
System.out.print("向服务发送拣货出库通知");}
}
package observer;
import bean.PickDoc;
/**
- 通知客户已拣货出库
- @author zhousjmas@hotmail.com
-
*/
public class CustomerStockOutNotify implements IStockOutNotify {@Override
public void nodify(PickDoc pickDoc) {System.out.print("向客户发送拣货出库通知");
}
}
package observer;
import bean.PickDoc;
/**
- 通知仓库拣货出库的问题
- @author zhousjmas@hotmail.com
-
*/
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);
}
}
输出的效果
来源:51CTO
作者:mas199980
链接:https://blog.51cto.com/4890631/2485028