[设计模式]3. Observer

来源:互联网 发布:人生七年 知乎 编辑:程序博客网 时间:2024/05/28 03:03

Observer:降低依赖,提升互换.(委托+hook)

前面的Template Method和Factory Method是将【变化】的部分委托给子类,当子类变化时替换新的子类。【继承式反向控制】

image

图1:继承式反向控制

委托式反向控制(IoC)

image

图2:委托式反向控制

看如下代码:

package cn.pw.java.dp.observer;public class ObserverMain {    public static void main(String[] args) {        Invarient iv = new Invarient();        iv.attach(new Varient());        iv.template_method();    }}//【不变】部分包含【会变】的Varientclass Invarient {    private Varient obj; // Varient本身是【会变】的,包括其类名。    public void template_method() {        obj.hook_varient();    }    public void attach(Varient o) { // Varient本身是【会变】的        obj = o;    }}//【会变】class Varient {    public void hook_varient() {        System.out.println("hook_varient...");    }}

上面【不变】部分包含【会变】的Varient,就会造成依赖。这时将Varient抽象出Observer。如图:

image

图4:Observer

package cn.pw.java.dp.observer;public class ObserverMain2 {    public static void main(String[] args) {        Invarient2 iv2 = new Invarient2();        iv2.attach(new ConcreteObserver_Varient());        iv2.template_method();    }}//【不变】的应用框架,Observer委托给Invarient2处理class Invarient2 {    private Observer obj;    public void template_method() {        obj.hook_varient();    }    protected void attach(Observer o) {        obj = o;    }}//【不变】的应用框架abstract class Observer {    public abstract void hook_varient();}//【会变】的APclass ConcreteObserver_Varient extends Observer {    public void hook_varient() {        System.out.println("hook_varient...");    }}

此时类图:

image

图4:优化的Observer

另外Java只支持单继承,因此对纯虚抽象类Observer,考虑使用接口IObserver替代。如下图:

image

图6:优化的Observer

abstract class Observer {    public abstract void hook_varient();}//Observer换成即可IObserverinterface IObserver {    void hook_varient();}

GOF Observer

UML类图和时序图: 【wiki】

image

在上述UML类图中,Subject类不直接更新依赖对象的状态。相反,Subject指的是更新状态的Observer interface(update()),这使得Subject独立于依赖对象的状态如何更新。该类Observer1和Observer2类Observer通过将其状态与主体的状态同步来实现接口。

UML时序图显示了运行时的相互作用:在Observer1和Observer2对象调用attach(this)上Subject1登记自己。假设Subject1变化的状态,Subject1呼唤notify()自己。
notify()调用update()在注册Observer1和Observer2对象,请求改变的数据(getState())从Subject1更新(同步)它们的状态。

Android中类似应用

View OnClickListener

image

图9:Android ClickListener应用

对比图6:

IObserver 引用,(其子类是 可变部分)===> 看做 OnClickListener

Subject_Invarient ===> 看做是View

ConcreteSubject ===> 看做是Button等

attach(IObserver) ===> 看做是setOnClickListener(listener)

hook_varient() ===> 看做是 onClick(..)

BaseAdapter Observer

image

原创粉丝点击