解決問題
觀察者模式又稱之為釋出-訂閱模式,它的一個關鍵作用是使角色之間解耦合。
應用場景
常見的應用場景是分散式事務處理與MVC架構,但我們也可以將其應用於解耦合。
原理圖(UML)
-
Observer: 觀察者介面,即當觀察者觀察到變化之後應該執行的操作
-
ConcreteObserver:具體執行操作的的實體物件
-
Subject:主題,也可以理解為被觀察者,它主要由三個動作:新增觀察物件、刪除觀察物件、通知觀察物件,它持有一上屬性:觀察者物件列表
示例
類似釋出-訂閱的示例已經有很多了,我們舉一個單純解耦合的示例:當一個請求到來時,我需要呼叫多個(例子中使用兩上個)依賴服務並返回結果
Observer:這裡我將其理解為一個後臺服務,一旦收到一個請求,就需要呼叫後臺服務拿資料
public interface Server<T> {
public T excute(Request params);
}
public class RpcServer<T> implements Server<T> {
public T excute(Request params) {
return null;// 定義具體的服務呼叫。。。。
}
// 引數解析、結果轉換、異常處理、容災等。。。。
}
public class HttpServer<T> implements Server<T> {
public T excute(Request params) {
return null;// 定義具體的服務呼叫。。。。
}
// 引數解析、結果轉換、異常處理、容災等。。。。
}
複製程式碼
Suject:這裡將其理解為一個HTTP服務,需要呼叫多個後臺服務來為前臺提供資料
/**
*
* 即為controller提供服務,controller傳入request物件,service返回組裝結果
*/
public interface Service<R> {
public R getData();
}
public class HttpService implements Service<List< Object>> {
public List<Server> servers = Lists.newArrayList();
public List<Object> getData() {
List<Object> result = Lists.newArrayList();
// 這裡可以一般用非同步來實現。。。。
for (Server server : servers) {
result.add(server.excute(null));
}
return null;
}
}
複製程式碼
參考
https://en.wikipedia.org/wiki/Observer_pattern