[设计模式]3. Observer
来源:互联网 发布:人生七年 知乎 编辑:程序博客网 时间:2024/05/28 03:03
Observer:降低依赖,提升互换.(委托+hook)
前面的Template Method和Factory Method是将【变化】的部分委托给子类,当子类变化时替换新的子类。【继承式反向控制】
图1:继承式反向控制
委托式反向控制(IoC)
图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。如图:
图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..."); }}
此时类图:
图4:优化的Observer
另外Java只支持单继承,因此对纯虚抽象类Observer,考虑使用接口IObserver替代。如下图:
图6:优化的Observer
abstract class Observer { public abstract void hook_varient();}//Observer换成即可IObserverinterface IObserver { void hook_varient();}
GOF Observer
UML类图和时序图: 【wiki】
在上述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
图9:Android ClickListener应用
对比图6:
IObserver 引用,(其子类是 可变部分)===> 看做 OnClickListener
Subject_Invarient ===> 看做是View
ConcreteSubject ===> 看做是Button等
attach(IObserver) ===> 看做是setOnClickListener(listener)
hook_varient() ===> 看做是 onClick(..)
BaseAdapter Observer
- [设计模式]3. Observer
- 设计模式:Observer模式
- 设计模式-Observer 模式
- 设计模式----Observer模式
- 设计模式 - Observer模式
- 设计模式----Observer模式
- 【设计模式】Observer模式
- 设计模式--Observer 模式
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之--Observer
- 设计模式之--Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- Boost算法库——C++11算法(any_of)
- Redis 字符串(String)
- NOI模拟(10.29)T1 管道
- PE文件结构及其加载机制(二)
- NOIP2014D2T2 寻找道路
- [设计模式]3. Observer
- Unity3D-扩充菜单栏功能
- 自定义开关机动画,开机logo
- ulimit命令
- 源码安装zabbix LNMP源码安装
- 异常处理基础1
- 代理模式
- Redis 哈希(Hash)
- 页面布局 --- 多列等高布局