觀察者模式又稱之爲發佈-訂閱模式,它的一個關鍵做用是使角色之間解耦合。bash
常見的應用場景是分佈式事務處理與MVC架構,但咱們也能夠將其應用於解耦合。架構
Observer: 觀察者接口,即當觀察者觀察到變化以後應該執行的操做異步
ConcreteObserver:具體執行操做的的實體對象分佈式
Subject:主題,也能夠理解爲被觀察者,它主要由三個動做:添加觀察對象、刪除觀察對象、通知觀察對象,它持有一上屬性:觀察者對象列表ui
相似發佈-訂閱的示例已經有不少了,咱們舉一個單純解耦合的示例:當一個請求到來時,我須要調用多個(例子中使用兩上個)依賴服務並返回結果spa
Observer:這裏我將其理解爲一個後臺服務,一旦收到一個請求,就須要調用後臺服務拿數據code
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服務,須要調用多個後臺服務來爲前臺提供數據cdn
/**
*
* 即爲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_patternserver