觀察者模式和代理模式

單例模式   工廠方法模式  觀察者模式  代理模式
命令模式。適配器模式、合成模式、訪問者模式

觀察者模式

http://blog.csdn.net/fangchongbory/article/details/7774044

http://blog.csdn.net/ahuier/article/details/8469536

    對象間的一種一(Subject)對多(Observer)的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新 。觀察者模式解除了主題和具體觀察者的耦合,讓耦合的雙方都依賴於抽象,而不是依賴具體。從而使得各自的變化都不會影響另一邊的變化。
1. Subject(目標)目標知道它的觀察者,可以有任意多個觀察者觀察同一個目標,提供註冊和刪除觀察者對象的接口
2. Observer(觀察者) 爲那些在目標發生改變時需獲得通知的對象定義一個更新的接口
3. ConcreteSubject(具體目標)將有關狀態存入各ConcreteObserver對象,當它的狀態發送改變時,向它的各個觀察者發出通知
4. ConcreteObserver(具體觀察者)維護一個指向ConcreteObserver對象的引用,存儲有關狀態,這些狀態應與目標的狀態保持一致
1.Observer(觀察者),DataSetObserver抽象2個方法,一個是觀察數據改變的方法,一個是觀察數據變成無效(或者不可用)時的方法。實現 Observer接口並把自己註冊到 Subject 中就能夠接收到消息事件;
源碼路徑:framework/base/core/java/android/database/DataSetObserver.java
   public void onChanged() {  
        // Do nothing  
    }  
   public void onInvalidated() {  
        // Do nothing  
    }  
2.Subject(目標),Observable<T>是一個泛型的抽象類,繼承Observable類主要功能是註冊和撤銷observer。被觀察者在調用 notifyObservers(content)(通知所有觀察者)函數通知觀察者之前一定要調用setChanged()(標識狀態或內容發生改變)函數,要不然觀察者無法接到通知; registerObserver();unregisterObserver();unregisterAll();
源碼路徑:framework/base/core/java/android/database/Observable.java
3.ConcreateObserver(具體觀察者),具體觀察者的任務是實實在在執行action的類,一般由開發者根據實際情況,自己實現。android也有實現的例子.觀察者接受到通知後,調用update方法進行更新操作。
源碼路徑:framework/base/core/java/android/widget/AbsListView.java   
代理模式
在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
   抽象角色:聲明真實對象和代理對象的共同接口。
  代理角色:代理對象角色內部含有對真實對象的引用,從而可以操作真實對象,同時代理對象提供與真實對象相同的接口以便在任何時刻都能代替真實對象。同時,代理對象可以在執行真實對象操作時,附加其他的操作,相當於對真實對象進行封裝。代理對象通常在客戶端調用傳遞給目標對象之前或之後,執行某個操作,而不是單純地將調用傳遞給目標對象。
  真實角色:代理角色所代表的真實對象,是我們最終要引用的對象。
    Java動態代理類位於java.lang.reflect包下,一般主要涉及到以下兩個類:
    (1)Interface InvocationHandler:該接口中僅定義了一個方法
        public object invoke(Object obj,Method method, Object[] args)在實際使用時,第一個參數obj一般是指代理類,method是被代理的方法,如上例中的request(),args爲該方法的參數數組。這個抽象方法在代理類中動態實現。
    (2)Proxy:該類即爲動態代理類(代理角色),其中主要包含以下內容
        1) protected Proxy(InvocationHandler h):構造函數,用於給內部的h賦值。
        2) static Class getProxyClass (ClassLoader loader, Class[] interfaces):獲得一個代理類,其中loader是類裝載器,interfaces是真實類所擁有的全部接口的數組。
        3) static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理類的一個實例,返回後的代理類可以當作被代理類使用
   在生成它的實例時你必須提供一個handler,由它接管實際的工作.在使用動態代理類時,我們必須實現InvocationHandler接口.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章