[设计模式]3. Observer

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();
    }
}
//【不变】部分包含【会变】的Varient
class 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();
}
//【会变】的AP
class 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换成即可IObserver
interface 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值