今天再看《重构》这本书,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();
观察者类:
implements java.util.Observer实现 Observer 接口的唯一方法 update
void update(Observable o, Object arg)