observer-觀察者模式

解決問題

觀察者模式又稱之爲發佈-訂閱模式,它的一個關鍵做用是使角色之間解耦合。bash

應用場景

常見的應用場景是分佈式事務處理與MVC架構,但咱們也能夠將其應用於解耦合。架構

原理圖(UML)

  • 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

相關文章
相關標籤/搜索