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

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

1,噹噹前被關注的事件發生時它的觀注者會被通知到設計模式

2,避免通知動做與關注者的硬性綁定,要進行解耦ide

這是觀察者模式的本質思路,不該被其餘過多的硬性的準確的描述所幹擾。this

仍是以具體的業務作爲切入點來理解觀察者模式設計

在揀貨完成要進行出庫時,會簡略作如下幾個動做好比code

1,修改出庫單據的狀態server

2,通知服務(ERP)系統,倉儲要出庫了對象

3,通知客戶(實際上要調用好比短信接口等)揀貨出庫了blog

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實現

相關文章
相關標籤/搜索