觀察者模式 粗淺地說就是作了兩件事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); }
}
輸出的效果