观察者模式是一种很常用的设计模式之一,它是一种多对一的监督机制,即一个多个观察者可以注册到一个观察者.被观察者的状态改变将引发观察者相应的业务.
而现实中我们会碰到很多这样的情形,一个对象的业务引发依赖于另一个对象的状态改变,比如在一个订票系统中由需求决定,当我们对票价或名称进行调整时,对客户进行相应提示,而这时如果我们不用观察者模式,可能就需要创建线程来进行监控,这样就会增加系统的压力,并且使得系统稳定性和可维护性保障度并不高.
本人针对票价改变引发相应业务案例结合jdk对观察者模式的支持类做了相应的设计尝试,代码如下:
首先定义了一个Prouct为被观察者,Product继承了jdk自定义的Observable类,Observable里面封装了被观察者的状态改变,注册和删除观察者的方法:
package com.tzl.model.observe;
import java.util.Observable;
public class Product extends Observable {
private float price ;
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
setChanged();
notifyObservers(new Float(price));
}
}
其次定义了一个PriceObserve为观察者,它实现了Observer接口,Observer里update方法根据被观察者Observable的相应改变Observer做相应的业务.
package com.tzl.model.observe;
import java.util.Observable;
import java.util.Observer;
public class PriceObserve implements Observer{
private Float priceFloat;
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
if (arg instanceof Float) {
priceFloat=((Float) arg).floatValue();
System.out.println("price 调整为"+priceFloat);
}
}
}
最后,定义了一个ProductObserverControl来对观察者和被观察者注册关系进行管理和控制:
package com.tzl.model.observe;
public class ProductObserverControl {
private Product product;
public void setProduct(Product product) {
this.product=product;
}
public void register(PriceObserve priceObserve) {
product.addObserver(priceObserve);
}
public void removePriceObserve(PriceObserve priceObserve) {
product.deleteObserver(priceObserve);
}
}
测试代码:
package com.tzl.model.observe;
public class TestObserver {
public static void main(String[] args) {
ProductObserverControl productObserverControl=new ProductObserverControl();
PriceObserve priceObserve=new PriceObserve();
Product product=new Product();
productObserverControl.setProduct(product);
productObserverControl.register(priceObserve);
product.setPrice(521);
}
}
输出结果: