您的位置:首页 > 编程语言 > Java开发

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事件处理的方法并不在此文章中过多描述。

下面写一个在电商系统中很经常遇到的例子,如果商品价格发生了变化,那么将此商品价格变化的事件通知给对应的会员, 形如 降价通知 的简单实现:

代码分为三个部分,商品类;顾客类;测试类;

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息