今天再看《重构》这本书,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)