在众多的设计模式中观察者(Observer)模式用的也是比较多的,也许有人会问“什么是观察者(Observer)模式”。在这里呢就有这么个例子:房价是我们比较个关注的一个问题,一般来说只要房价发生变化,购房者就会知道,在程序里这些购房者就叫做“观察者”,房价的变化则是可观察的。这就是一个比较好的例子。那么我们也可以用程序来写一下这个例子。下面将会使用到一个类和两个接口,下面就为大家介绍一下。
被观察者必须实现Observable类,观察者则要实现Observer接口。
Observer接口如下所示:
public interface Observer{
void update(Observable o,Object arg);
}
第一个参数表示被观察者实例,第二个参数表示修改的内容。


上面列出来的就是我们要用到的东西,上面的图只是其中一部分,详细的可以自己去看文档。现在开始来一步一步的进行设计。
1.写一个House并继承Observable类。
package org.lxh.impl;
import java.util.Observable;
/*
* 这里的House可以理解为"被观察者",所以要继承Observable
*/
public class House extends Observable {
private int price;
public House(int price) {
this.price=price;
}
public void setPrice(int price) {
super.setChanged(); //设置变化点
super.notifyObservers(price); //通知所有观察者价格已改变
this.price = price;
}
public int getPrice() {
return price;
}
public String toString() {
return "房子的价格为:" + price;
}
}
2.写一个房屋观察者HouseObserver,不要忘记让它实现Observer接口。如下所示
package org.lxh.impl;
import java.util.Observable;
import java.util.Observer;
public class HouseObserver implements Observer {
String name;
public HouseObserver(String name) {
this.name=name;
}
public void update(Observable obser, Object obj) {
if(obj instanceof Integer) //判断参数类型
{
System.out.println(name+"观察到的房价是:"+obj.toString()); //这是其中一种取得obj值的方法
//System.out.println(name+"观察到的房价是:"+((Integer)obj).intValue()); //这是另外一种取得obj值的方法
}
}
}
3.写一个测试类进行测试package org.lxh.impl;
public class Test {
/**
* 这个类用来对观察者模式进行测试
*/
public static void main(String[] args) {
House h=new House(2000);
HouseObserver ho1=new HouseObserver("Tom");
HouseObserver ho2=new HouseObserver("Amy");
HouseObserver ho3=new HouseObserver("Smith");
h.addObserver(ho1); //添加观察者
h.addObserver(ho2);
h.addObserver(ho3);
System.out.println(h);
System.out.println("================房价开始变化了===============");
h.setPrice(2500);
System.out.println(h);
System.out.println("================删除一个观察者Amy===============");
h.deleteObserver(ho2); //删除观察者Amy
h.setPrice(2600);
System.out.println(ho2.name+"现在已经不是观察者了,所以不能获得房屋信息");
System.out.println(h);
}
}
下面看一下效果截图

观察者模式详解
本文通过一个房价变动的例子详细介绍了观察者模式的实现方法。通过创建House类作为被观察者,并继承Observable类,同时定义HouseObserver类作为观察者,实现Observer接口。文章最后还提供了一个测试类来验证观察者模式的效果。
1045

被折叠的 条评论
为什么被折叠?



