锁定老帖子 主题:Java 中的 Observer
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (4)
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-19
最后修改:2009-06-19
Java 中的 Observer : Java 提供了 Observer 模式的默认实现,下面我们就看一下 Java 对 观察者模式的支持。 Java 对 观察者模式的支持 主要体现在 Observable 类和 Observer 接口。
(1) Observable 类代表 被观察者 (java.util.Observable ) 主要方法有:
void setChanged()
: 设置被观察者的状态已经被改变
void notifyObservers(Object arg)
: 通知所有观察者(带参数,参数一般设定为被改变的属性) (2) Observer 接口代表 观察者 (java.util.Observer ) 它只有一个抽象方法需要被具体的观察者类实现(很重要 ): void update(Observable observable, Object arg) :当 被观察者 调用 notifyObservers(*) 方法 时,会根据被观察者的 hasChanged() 方法 来判断 它的状态是否被改变, 如果被观察者的状态被改变了,则 会调用 观察者 的 update 方法,参数 observable 为 被观察者对象, arg 为调用 notifyObservers( Object arg ) 时传入的参数 arg ,如果调用的是 notifyObservers() 方法, 则 arg 为 null( 注意 :应该把这个参数 arg 设定为 被观察者的 被改变的属性)。
下面是一个实例: 被观察者 是 一个商品,当它的价格被改变后,就会通知相应的关注此商品的 客户(观察者)。
1,Good 类:商品类,继承了 Observable 类。
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); } }
2,Customer 类:客户类,实现了 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("客户<"+this.name+"> : "+((Good)observable).getName()+"的价格变了,"+arg+"元了 !"); } } }
3,Test 测试类:
public class Test { public static void main(String[] args){ Good good = new Good("洗衣粉",3.5f); Customer tom = new Customer("Tom"); Customer jerry = new Customer("Jerry"); good.addObserver(tom); good.addObserver(jerry); good.setPrice(2.5f); good.setPrice(3.0f); } }
运行 Test 类,输出如下:
客户<Jerry> : 洗衣粉的价格变了,2.5元了 !
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 3113 次