設計模式-觀察者模式JAVA實現

觀察者模式 粗淺地說就是做了兩件事

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

}

輸出的效果
設計模式-觀察者模式JAVA實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章