学习笔记-轻量级Java EE:模式--观察者模式

来源:互联网 发布:comway 无线串口软件 编辑:程序博客网 时间:2024/06/05 15:58

观察者模式定义了对象间一对多依赖关系,让一个或多个观察者对象观察一个主题对象;当主题对象的状态发生改变时,系统能通知所有依赖于此对象的观察者对象,从而使观察者对象能够自动更新。

在观察者模式中,被观察的对象常常被称为目标或者主题(Subject),依赖的对象被称为观察者(Observer)。

例子:

1.先提供一个观察者接口:(JDK 已提供,可直接使用java.util.Observer,如不符合条件,则自行设计)

所有的观察者都应该实现该接口,其中update方法中的Observable参数代表被观察对象。

public interface Observer{void update(Observable o , Object arg);}
2.接着提供一个Observable抽象基类,此类是被观察对象应该继承的对象(JDK已提供,可直接使用java.util.Observable,如不符合条件,则自行设计)

public abstract class Observable{// 用一个List来保存该对象上所有绑定的事件监听器List<Observer> observers = new ArrayList<Observer>();//定义一个方法,用于从该主题上注册观察者public void registObserver(Observer o){observers.add(o);}//定义一个方法,用于从该主题中删除观察者public void removeObserver(Observer o){observers.remove(o);}//通知该主题上注册的所有观察者public void notifyObservers(Object value){//遍历注册到该被观察者上的所有观察者for (Iterator it = observers.iterator(); it.hasNext(); ){Observer o = (Observer)it.next();//显式每个观察者的update方法o.update(this , value);}}}
3.提供一个被观察者类:Product,继承了Observable基类

public class Product extends Observable{//定义两个属性private String name;private double price;//无参数的构造器public Product(){}public Product(String name , double price){this.name = name;this.price = price;}public String getName(){return name;}//当程序调用name的setter方法来修改Product的name属性时//程序自然触发该对象上注册的所有观察者public void setName(String name){this.name = name;notifyObservers(name);}public double getPrice(){return price;}//当程序调用price的setter方法来修改Product的price属性时//程序自然触发该对象上注册的所有观察者public void setPrice(double price){this.price = price;notifyObservers(price);}}
4.编写俩个观察者对象:继承基类Observer

public class NameObserver implements Observer{//实现观察者必须实现的update方法public void update(Observable o , Object arg){if (arg instanceof String ){//产品名称改变值在name中String name = (String)arg;System.out.println("名称观察者:" +o + "物品名称已经改变为: " + name);}}}
public class PriceObserver implements Observer{//实现观察者必须实现的update方法public void update(Observable o , Object arg){if(arg instanceof Double){System.out.println("价格观察者:" +o + "物品价格已经改变为: " + arg);}}}
5.编写一个测试程序:

public class Test{public static void main(String[] args) {//创建一个被观察者对象Product p = new Product("电视机" , 176);//创建两个观察者对象NameObserver no = new NameObserver();PriceObserver po = new PriceObserver();//向被观察对象上注册两个观察者对象p.registObserver(no);p.registObserver(po);//程序调用setter方法来改变Product的name和price属性p.setName("书桌");p.setPrice(345f);}}
当调用Product对象的set方法时,观察者对象都会被触发;

如果学习过或者使用过java事件机制的底层实现,采用的是观察者模式;

另外在java EE中也有使用,例如主题/订阅模式下的JMS(java message service,java消息服务),本身就是观察者模式的应用,如下示例图:


0 0