适用场合:一个对象(被观察者)发生变化时,能自动通知其他对象(观察者)。
下述例子程序的对应场景:网上商店的产品价格变化时,自动通知消费者。
package com.javaeye.kang.observer;
import java.util.Observable; import java.util.Observer;
/* * 观察者模式 * Product 是被观察者, Customer 是观察者 * Product 价格变化后,一定要让 Customer 知道 * 目标: Product 不用关心具体通知谁, Customer 也不用关心通知是谁发出的 */
// 产品类,被观察者 class Product extends Observable { private String name ; private double price ; public Product(String name, double price) { this . name = name; this . price = price; } // 可以用 spring 将对象注入进来 public void setObserver(Observer observer) { this .addObserver(observer); } public void changePrice( double newPrice) { this . price = newPrice; // 设置变化点,表示要通知观察者 this .setChanged(); // 通知所有观察者,给一个消息 this .notifyObservers ( " 通知:价格变化了!变成了 " + newPrice); // 此时就能够自动调用观察者的 update 方法 } }
// 顾客类,观察者 class Customer implements Observer { private String name ; public Customer(String name) { this . name = name; } // 参数 1 :来源于哪个对象;参数 2 :通知消息 public void update(Observable observable, Object object) { System. out .println(object); } }
public class ObserverTest { public static void main(String[] args) { Product pro = new Product( " 黄瓜 " ,12); Customer cus = new Customer( " 张三 " ); // 绑定观察者和被观察者,一个被观察者可以设置多个观察者 //pro.addObserver(cus); pro.setObserver(cus); // 对上面一句的小改进 pro.changePrice(13); } } |
测试结果:
通知:价格变化了!变成了 13.0 |
观察者模式练习
场景:银行账户余额变动时,自动通知Dao对象
package com.javaeye.kang.observer;
import java.util.Observable; import java.util.Observer;
/** * 观察者模式练习 * */ // 账户类,被观察者 class Account extends Observable { private long number ; private int key ; private String name ; private double count ; public Account( long number, int key, String name, double count) { this . number = number; this . key = key; this . name = name; this . count = count; } public void setObserver(Observer observer) { this .addObserver(observer); } public void changeCount( double newCount) { this . count = newCount; this .setChanged(); this .notifyObservers( " 通知:余额改变了,变成了 " + newCount); } }
// 观察者 class AccountDao implements Observer { public void update(Observable observable, Object object) { System. out .println(object); } }
public class TestObserver { public static void main(String[] args) { Account account = new Account(0001,1234, " 张三 " ,1000); AccountDao aDao = new AccountDao(); account.setObserver(aDao); account.changeCount(1500); } } |
测试结果:
通知:余额改变了,变成了 1500.0 |