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