java Observer模式 重构 Duplicate Observed Data
2014-06-01 00:00
375 查看
摘要: 使用java内置的观察者API进行观察者模式的实现,java.util.Observable类和java.util.Observer接口完成。类似电商系统中 降价通知 的简单实现。
今天再看《重构》这本书,8.6这一篇:Duplicate Observed Data ,讲述可以使用类似观察者模式的方法,将处理用户界面的处理业务逻辑的代码分开,形如MVC模式;
观察者模式就相当于使用观察者一直注意着view层的数据变化,如果变化,就需要使用Controller层进行业务处理,隔离了view--Controller;
在spring中,类似 Spring事件处理 的方法,也可以理解为 观察者模式:
◆定义Event类,继承org.springframework.context.ApplicationEvent。
◆编写发布事件类Publisher,实现org.springframework.context.ApplicationContextAware接口。
◆覆盖方法setApplicationContext(ApplicationContext applicationContext)和发布方法publish(Object obj)。
◆定义时间监听类EventListener,实现ApplicationListener接口,实现方法onApplicationEvent(ApplicationEvent event)。
关于 Spring事件处理的方法并不在此文章中过多描述。
下面写一个在电商系统中很经常遇到的例子,如果商品价格发生了变化,那么将此商品价格变化的事件通知给对应的会员, 形如 降价通知 的简单实现:
代码分为三个部分,商品类;顾客类;测试类;
被观察者类:
调用
当被观察事件发生时,执行:
setChange()
方法用来设置一个内部标志位注明数据发生了变化;
notifyObservers()
方法会去调用观察者对象列表中所有的
Observer
的
update()
方法,通知它们数据发生了变化。
只有在
setChange()
被调用后,
notifyObservers()
才会去调用
update()
。
观察者类:
实现
Observer
接口的唯一方法
update
形参
Object arg
,对应一个由
notifyObservers(Object arg);
传递来的参数,当执行的是
notifyObservers();
时,
arg
为
null
。
今天再看《重构》这本书,8.6这一篇:Duplicate Observed Data ,讲述可以使用类似观察者模式的方法,将处理用户界面的处理业务逻辑的代码分开,形如MVC模式;
观察者模式就相当于使用观察者一直注意着view层的数据变化,如果变化,就需要使用Controller层进行业务处理,隔离了view--Controller;
在spring中,类似 Spring事件处理 的方法,也可以理解为 观察者模式:
◆定义Event类,继承org.springframework.context.ApplicationEvent。
◆编写发布事件类Publisher,实现org.springframework.context.ApplicationContextAware接口。
◆覆盖方法setApplicationContext(ApplicationContext applicationContext)和发布方法publish(Object obj)。
◆定义时间监听类EventListener,实现ApplicationListener接口,实现方法onApplicationEvent(ApplicationEvent event)。
关于 Spring事件处理的方法并不在此文章中过多描述。
下面写一个在电商系统中很经常遇到的例子,如果商品价格发生了变化,那么将此商品价格变化的事件通知给对应的会员, 形如 降价通知 的简单实现:
代码分为三个部分,商品类;顾客类;测试类;
package observer; import java.util.Observable; public class Good extends Observable { private String name; private float price; public Good(String name, float price) { this.name = name; this.price = price; } public String getName() { return name; } public float getPrice() { this.notifyObservers(price); return price; } public void setPrice(float price) { this.price = price; /* * 注意 :在通知 所有观察者之前 一定要调用 setChanged()方法来设置被观察者的状态已经被改变, */ this.setChanged(); /* * notifyObservers 方法在通知完所有吗 观察者 后, 会自动调用 clearChanged 方法来清除 被观察者 的状态改变。 */ this.notifyObservers(price); } }
package observer; import java.util.Observable; import java.util.Observer; public class Customer implements Observer { private String name; public Customer(String name) { this.name = name; } public String getName() { return name; } public void update(Observable observable, Object arg) { if (observable instanceof Good && arg instanceof Float) { System.out.println("VIP客户<" + this.name + ">您好 : " + ((Good) observable).getName() + "的价格变了," + arg + "元了 !"); } } }
package observer; public class Test { public static void main(String[] args) { Good good = new Good("商品A", 1.0f); Customer alexgaoyh_1 = new Customer("alexgaoyh_1"); Customer alexgaoyh_2 = new Customer("alexgaoyh_2"); good.addObserver(alexgaoyh_1); good.addObserver(alexgaoyh_2); good.setPrice(10.0f); good.setPrice(30.0f); } }以上三处代码的简单实现,实现了当商品价格发生变化的话,会及时通知给对应的顾客。
被观察者类:
extends java.util.Observable
调用
void addObserver(Observer o)
当被观察事件发生时,执行:
setChanged(); notifyObservers();
setChange()
方法用来设置一个内部标志位注明数据发生了变化;
notifyObservers()
方法会去调用观察者对象列表中所有的
Observer
的
update()
方法,通知它们数据发生了变化。
只有在
setChange()
被调用后,
notifyObservers()
才会去调用
update()
。
观察者类:
implements java.util.Observer
实现
Observer
接口的唯一方法
update
void update(Observable o, Object arg)
形参
Object arg
,对应一个由
notifyObservers(Object arg);
传递来的参数,当执行的是
notifyObservers();
时,
arg
为
null
。
相关文章推荐
- 重构手法23:Duplicate Observed Data (复制“被监视数据”)
- 《重构,改善现有代码的设计》第八章 Duplicate Observed Data
- 『重构--改善既有代码的设计』读书笔记---Duplicate Observed Data
- 重构之1.Duplicate Observed Data 复制被监视数据
- 《重构,改善现有代码的设计》第八章 Duplicate Observed Data
- observer设计模式的java实现
- java中实现observer模式
- Discuz!NT 聚合功能页面程序架构(重构到Facade与Observer模式)
- observer设计模式的java实现
- Duplicate Observed Data(复制被监视数据)
- Java内置Observer的模式学习
- Java观察者模式 java.util.Observable 与 java.util.Observer 的理解
- Java中的观察者模式(Observer)
- Java中的观察者模式(Observer)
- Discuz!NT 聚合功能页面程序架构(重构到Facade与Observer模式)
- Java与模式 观察者模式Observer Pattern
- 从Java的角度理解设计模式1:什么是重构
- Java设计模式之Observer 观察者模式
- Java设计模式之Observer(观察者)模式
- Discuz!NT 聚合功能页面程序架构(重构到Facade与Observer模式)