观察者模式和代理模式

单例模式   工厂方法模式  观察者模式  代理模式
命令模式。适配器模式、合成模式、访问者模式

观察者模式

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接口.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章