设计模式17——Observer设计模式

来源:互联网 发布:淘宝直播蜜蜡是真的吗 编辑:程序博客网 时间:2024/06/05 19:12

Observer观察者设计模式用于将对象的变化通知给感兴趣的用户。在Observer模式中的角色为主题(subject)与观察者(observer),观察者订阅它感兴趣的主题,一个主题可以被多个观 察者订阅,当主题的状态发生变化时,它必须通知(notify)所有订阅它的观察者,观察者检视主题的状态变化,并作出对应的动作,所以Observer模式也称之为Publish-Subscribe模式。 Observer观察者设计模式结构如下:

观察者模式顺序图如下:


以一个电子商务网站商品价格变时通知订阅用户为例,演示Observer观察者设计模式,代码如下:

[java] view plaincopy
  1. //主题  
  2. interface Subject{  
  3.     //注册观察者  
  4.     public void registerObserver(Observer o);  
  5.     //注销观察者  
  6.     public void unregisterObserver(Observer o);  
  7.     //通知观察者  
  8.     public void notifyObservers();  
  9. }  
  10. //观察者  
  11. interface Observer{  
  12.     //更新价格信息  
  13.     public void update(float price);  
  14. }  
  15. //商品  
  16. class Product implements Subject{  
  17.     //观察者列表  
  18.     private List<Observer> observers = new ArrayList<Observer>();  
  19.     private float price;  
  20.     public void registerObserver(Observer o){  
  21.     observers.add(o);  
  22. }  
  23. public void unregisterObserver(Observer o){  
  24.     observers.remove(o);  
  25. }  
  26. public void notifyObservers(){  
  27.     for(Observer observer : observers){  
  28.         //主题向观察者推送更新数据  
  29.     observer.update(price);  
  30. }  
  31. }  
  32. public void priceChanged(){  
  33.     notifyObservers();  
  34. }  
  35. public void setPrice(float price){  
  36.     this.price = price;  
  37.     priceChanged();  
  38. }  
  39. }  
  40. //订阅者  
  41. class Subscriber implements Observer{  
  42.     private float currentPrice;  
  43.     //观察者引用主题  
  44.     private Subject product;  
  45.     public Subscriber(Subject product){  
  46.     this.product = product;  
  47.     //主题注册观察者  
  48.     product.registerObserver(this);  
  49. }  
  50. public void update(float price){  
  51.     this. currentPrice = price;  
  52.     System.out.println(“Current price change to:” + currentPrice);  
  53. }  
  54. }  
  55. public class ObserverDemo{  
  56.     public static void main(String[] args){  
  57.     Subject product = new Product();  
  58.     Subscriber subscriber = new Subscriber(product);  
  59.     product.setPrice(10.98);  
  60.     product.setPrice(998.15);  
  61. }  
  62. }  

在java的java.util中内置了Observer观察者设计模式,其中:

(1).java.util.Observable是主题类,所有继承了该类的类是事件发生的主题,也是被观察的对象。java.util.Observable的常用方法有:

a.public void addObserver(Observer o):为主题添加观察者。

b.publicvoid deleteObserver(Observer o):删除某个观察者。

c.publicvoid deleteObservers():删除主题上的所有观察者。

d.publicboolean hasChanged():测试主题是否改变。

e.protectedvoid setChanged():标记该主题对象已经改变。

f.publicvoid notifyObservers():通知所有观察者对象已经已经改变。

(2).java.util.Observer接口是观察者,所有实现了该接口的类都是主题事件的观察者,该接口只有一个方法需要实现:

publicvoid update(Observable o,  Object arg):通知观察者更新已经改变的主题。

使用JDK内置的Observer观察者设计模式,演示电子商务网站商品价格的例子如下:

[java] view plaincopy
  1. //商品  
  2. class Product extends Observable{  
  3.     private float price;  
  4. public void priceChanged(){  
  5.     //设置变化点  
  6.     setChanged();  
  7.     //通知观察者  
  8.     notifyObservers();  
  9. }  
  10. public void setPrice(float price){  
  11.     this.price = price;  
  12.     priceChanged();  
  13. }  
  14. public float getPrice(){  
  15.     return price;  
  16. }  
  17. }  
  18. //订阅者  
  19. class Subscriber implements Observer{  
  20.     private float currentPrice;  
  21.     //观察者引用主题  
  22.     private Observable observable;  
  23.     public Subscriber(Observable observable){  
  24.     this. observable = observable;  
  25.     //主题注册观察者  
  26.     observable.addObserver(this);  
  27. }  
  28. public void update(Observable observable, Object arg){  
  29.     if(observable instanceof Product){  
  30.     Product product = (Product) observable;  
  31.         this. currentPrice = product.getPrice();  
  32.         System.out.println(“Current price change to:” + currentPrice);  
  33. }  
  34. }  
  35. }  
  36. public class ObserverDemo{  
  37.     public static void main(String[] args){  
  38.     Observable product = new Product();  
  39.     Subscriber subscriber = new Subscriber(product);  
  40.     product.setPrice(10.98);  
  41.     product.setPrice(998.15);  
  42. }  
  43. }  

Observer观察者设计模式在界面编程中应用广泛,一个button往往会注册一个onclickListener,里面有onclickAction方法对点击进行响应,此时button充当的就是主题,而onclickListener就是观察者,而onclickAction就对应着观察者中对事件进行响应的update方法。

JDK中观察者模式的应用:

java.util.Observer
java.util.Observable
java.util.EventListener
javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListener
javax.faces.event.PhaseListener
0 0