observer-觀察者模式

fulton發表於2018-05-02

解決問題

觀察者模式又稱之為釋出-訂閱模式,它的一個關鍵作用是使角色之間解耦合。

應用場景

常見的應用場景是分散式事務處理與MVC架構,但我們也可以將其應用於解耦合。

原理圖(UML)

observer-觀察者模式

  • 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

相關文章