ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2020-04-05 17:55:08  阅读:196  来源: 互联网

标签:pickDoc stockOutNotify JAVA 通知 PickDoc 观察者 设计模式 public 出库


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

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

}

输出的效果
设计模式-观察者模式JAVA实现

标签:pickDoc,stockOutNotify,JAVA,通知,PickDoc,观察者,设计模式,public,出库
来源: https://blog.51cto.com/4890631/2485028

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有