观察者模式是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。观察者和被观察者的分开,为模块划分提供了清晰的界限。
通过观察者的定义我们可以得到两点:观察者是具体执行操作的对象,有多个;被观察者即被观察的对象,如果该对象发生某些变化则通知观察者执行对应的操作。
这里我通过一个例子加深对观察者模式的理解。一个网络商店中,当商品在名称和价格等方面有变化时, 系统将自动通知会员。这时就可以借助观察者模式来实现。这就需要在商品product中加入Observer这样角色,以便product细节发生变化时,Observer能自动观察到这种变化,并能进行及时的update或notify动作。
Java的API为为我们提供了现成的Observer接口Java.util.Observer。我们只要直接使用它就可以。
商品(Product)类即为被观察者,继承Observable来实现
商品名称检测(ObserName)类, 实现Observer接口
商品价格检测(ObserPrice)类, 实现Observer接口
测试(Test)类
结果为:
bag 20.8
name has changed to shoot
price has changed to 100.0
当我设置新商品的名称,或设置商品的价格,即对商品作相应的变动时,观察者将获得被观察者商品自动发来的通知。
通过观察者的定义我们可以得到两点:观察者是具体执行操作的对象,有多个;被观察者即被观察的对象,如果该对象发生某些变化则通知观察者执行对应的操作。
这里我通过一个例子加深对观察者模式的理解。一个网络商店中,当商品在名称和价格等方面有变化时, 系统将自动通知会员。这时就可以借助观察者模式来实现。这就需要在商品product中加入Observer这样角色,以便product细节发生变化时,Observer能自动观察到这种变化,并能进行及时的update或notify动作。
Java的API为为我们提供了现成的Observer接口Java.util.Observer。我们只要直接使用它就可以。
商品(Product)类即为被观察者,继承Observable来实现
import java.util.Observable;
public class Product extends Observable {
private String name;
private float price;
public Product(String name, float price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public float getPrice() {
return price;
}
public void setName(String name) {
this.name = name;
setChanged();
notifyObservers(name);
}
public void setPrice(float price) {
this.price = price;
setChanged();
notifyObservers(new Float(price));
}
}
商品名称检测(ObserName)类, 实现Observer接口
import java.util.Observable;
import java.util.Observer;
public class ObserName implements Observer {
private String name;
public void update(Observable arg0, Object arg1) {
if(arg1 instanceof String) {
name = (String) arg1;
System.out.println("name has changed to " + name);
}
}
}
商品价格检测(ObserPrice)类, 实现Observer接口
import java.util.Observable;
import java.util.Observer;
public class ObserPrice implements Observer {
private float price;
public void update(Observable o, Object arg) {
if(arg instanceof Float) {
price = ((Float) arg).floatValue();
System.out.println("price has changed to " + price);
}
}
}
测试(Test)类
public class Test {
public static void main(String[] args) {
Product p = new Product("bag", 20.8f);
p.addObserver(new ObserName());
p.addObserver(new ObserPrice());
System.out.println(p.getName() + "\t" + p.getPrice());
p.setName("shoot");
p.setPrice(100.00f);
}
}
结果为:
bag 20.8
name has changed to shoot
price has changed to 100.0
当我设置新商品的名称,或设置商品的价格,即对商品作相应的变动时,观察者将获得被观察者商品自动发来的通知。