zoukankan      html  css  js  c++  java
  • Java Observer 观察者

    http://www.cnblogs.com/jaward/p/3277619.html

    1、API

    被观察者
    java.util.Observable;
    public class Observable extends Object
      • void addObserver(Observer o);      如果该观察者集合里面没有这个观察者,添加进去。
      • protected void clearChanged();      把改变的状态清掉,即表示最近没有发生改变,使hasChanged()返回false
      • int countObserver();                     返回该Observable对象的观察者个数
      • void deleteObserver(Observer o);   删除一个观察者
      • boolean hasChanged();                 查看该Observable是否发生了改变
      • void notifyObservers();                 先调用hasChanged(),若返回true通知该对象所有观察者,然后用clearChanged()清掉状态
      • void notifyObservers(Object o);     同上,上面观察者update()接收的是null,这里可以返回想要通知的数据。
      • protected void setChanged();        设置变化,使到调用hasChanged()会返回true
     
    观察者
    java.util.Observer
    public interface Observer
      • void update(Observable o, Object arg); 只要发生变化,notifyObservers()就会通知观察者。

    2、用法

    被观察类需要继承Observable类,在数据改变的地方(如set***();)里加上setChanged(),在需要监听的地方使用notifyObservers(Object o)。

    观察者需实现Observer接口,对notifyObservers() 的提醒做出反应。

    为Observable添加观察者。

    复制代码
     1 //Test.java
     2 import java.util.Observable;
     3 import java.util.Observer;
     4 
     5 class Product extends Observable {
     6     private String name;
     7     private float price;
     8 
     9     public String getName() {
    10         return this.name;
    11     }
    12 
    13     public void setName(String name) {
    14         this.name = name;
    15         setChanged();
    16         notifyObservers(name);
    17     }
    18 
    19     public float getPrice() {
    20         return this.price;
    21     }
    22 
    23     public void setPrice(float price) {
    24         this.price = price;
    25         setChanged();
    26         notifyObservers(new Float(price));
    27     }
    28 }
    29 
    30 class NameObserver implements Observer {
    31     private String name = null;
    32 
    33     public void update(Observable obj, Object arg) {
    34         if (arg instanceof String) {
    35             this.name = (String)arg;
    36             System.out.println("NameObserver: name change to "+this.name);
    37         }
    38     }
    39 }
    40 
    41 class PriceObserver implements Observer {
    42     private float price = 0;
    43 
    44     public void update(Observable obj, Object arg) {
    45         if (arg instanceof Float) {
    46             price = ((Float)arg).floatValue();
    47             System.out.println("PriceObserver: price changte to "+price);
    48         }
    49     }
    50 }
    51 
    52 
    53 public class Test {
    54     public static void main(String args[]) {
    55         Product product = new Product();
    56 
    57         NameObserver nameobs = new NameObserver();
    58         PriceObserver priceobs = new PriceObserver();
    59     
    60 
    61         //add observer
    62         product.addObserver(nameobs);
    63         product.addObserver(priceobs);
    64 
    65 
    66         product.setName("apple");
    67         product.setPrice(9.22f);
    68     }
    69 }
    复制代码
  • 相关阅读:
    测试
    201920201 20199320《Linux内核原理与分析》第四周作业
    201920201 20199320《Linux内核原理与分析》第六周作业
    201920201 20199320《Linux内核原理与分析》第五周作业
    201920201 20199320《Linux内核原理与分析》第七周作业
    201920201 20199320《Linux内核原理与分析》第一周作业
    201920201 20199320《Linux内核原理与分析》第八周作业
    ASP.NET MVC3 Custom FormAuthorize
    堆排序练习题
    面试题:4亿里有多少个1(11算2个)。
  • 原文地址:https://www.cnblogs.com/feng9exe/p/5754930.html
Copyright © 2011-2022 走看看