观察者模式 java 实现_设计模式-观察者模式JAVA实现

该博客通过一个具体的业务场景——拣货出库,介绍了如何使用Java实现观察者模式。文章首先阐述了观察者模式的基本思想,即在事件发生时通知关注者,并实现解耦。接着,定义了通知接口`IStockOutNotify`,并创建了三个业务观察者类:`ServerStockOutNotify`、`CustomerStockOutNotify`和`WmsStockOutNotify`,分别代表服务系统、客户和仓储系统。通知者`StockOutNotify`负责保存观察者列表,接收出库单更新并通知所有观察者。最后,通过示例代码展示了如何使用这些类来完成拣货出库的通知流程。
摘要由CSDN通过智能技术生成

观察者模式 粗浅地说就是做了两件事

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 list = new ArrayList();

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);

}

}

输出的效果

cc5b98f6b1f9c27391f1d20a8c7d70d6.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值