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

1,当当前被关注的事件发生时它的观注者会被通知到

2,避免通知动作与关注者的硬性绑定,要进行解耦

这是观察者模式的本质思路,不应被其他过多的硬性的准确的描述所干扰。

还是以具体的业务做为切入点来理解观察者模式

在拣货完成要进行出库时,会简略做以下几个动作比如

1,修改出库单据的状态

2,通知服务(ERP)系统,仓储要出库了

3,通知客户(实际上要调用比如短信接口等)拣货出库了

3,通知WMS(仓储系统)要出库扣减库存了

从以上看出,除了要修改单据外。有三个业务要被通知到,那么我就可以对这三个业务进行抽象,使其成为观察者。

那么先设计顶层的接口
package observer;

import bean.PickDoc;

/**

  • 通知的实现接口
  • @author [email protected]
  • */
    public interface IStockOutNotify {

    //通知修改
    public void nodify(PickDoc pickDoc);
    }

这里就抽象出一个共同的接口,nodify方法,告诉这些系统哪个单据出库了。由这些系统自己去查找对应的客户与库存,进行记账,扣减库存,通知客户的操作。

然后抽出三个业务观注者
package observer;

import bean.PickDoc;

/**

  • 通知服务已拣货出库
  • @author [email protected]
  • */
    public class ServerStockOutNotify implements IStockOutNotify{

    @Override
    public void nodify(PickDoc pickDoc) {
    System.out.print("向服务发送拣货出库通知");

    }

}

package observer;

import bean.PickDoc;

/**

  • 通知客户已拣货出库
  • @author [email protected]
  • */
    public class CustomerStockOutNotify implements IStockOutNotify {

    @Override
    public void nodify(PickDoc pickDoc) {

    System.out.print("向客户发送拣货出库通知");

    }

}

package observer;

import bean.PickDoc;

/**

  • 通知仓库拣货出库的问题
  • @author [email protected]
  • */
    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);
}

}

输出的效果
设计模式-观察者模式JAVA实现_第1张图片