1. 观察者模式(Observer)
1.1. 概述
l 场景:网站产品价格等方面有变化,如果系统能自动通知会员,将是网上商店区别传统商店的一大特色,这就需要在商品product中加入Observer这样的角色,以便product细节发生变化时Observer能自动观察到这种变化,并能进行及时的update或notify动作
l 一个对象发生变化,能够通知另一个对象做相应工作
l Java的API还为我们提供现成的Observer接口Java.util.Observer,我们只要直接使用它就可以
l 我们的目的主要是想将值变化后通知客户的工作模块化。
1.2. 解决方法:使用Observer
//产品类,如果changePrice调用,一定要通知Customer //目标:Product不用关心要通知谁,Customer也不用关心通知是谁发出 //Product:被观察者,Customer:观察者 import java.util.*; class Product extends Observable{ private String pname; private double price; public void setObserver(Observer observer){//可以用Spring注入 this.addObserver(observer); } public Product(String pname,double price){ this.pname = pname; this.price = price; } public void changePrice(double newPrice){ this.price = newPrice; //通知观察者 this.setChanged(); //设置变化点,表示要通知观察者 this.notifyObservers("通知:价格变化了");//通知所有观察者,给一个消息 //此时就能够自动调用观察者的update方法 } } //顾客类 class Customer implements Observer{ private String cname; public Customer(String cname){ this.cname = cname; } //参数1:来源于哪个对象,参数2:消息 public void update(Observable o, Object arg){ System.out.println(arg); } public void printInfo(){ System.out.println(cname); } }
public class Observer1{ public static void main(String args[]){ Product pro = new Product("白菜",12); Customer cus = new Customer("张三"); //观察者和被观察者要绑定,一个被观察者可以设置多个观察者 pro.setObserver(cus); pro.changePrice(13);
} } |
1.3. Observer小结
1. 编写Observable类的函数,设置变化点,唤醒Observer
2. Observer里面编写update方法
3. 绑定,运行你要做的事情
4. 练习:编写一个Java Bean,存放帐号,密码,姓名,余额。当余额改变的时候,能够自动向数据库里面写一条历史记录。用观察者模式。