观察者模式(一)JDK中的观察者模式
概述 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
使用场景
- 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
- 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
- 一个对象必须通知其他对象,而并不知道这些对象是谁。
- 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
使用
java.util包中提供了Observable类和Observer接口,其中要求,被观察者需要继承Observable类,观察则需要实现Observer接口
举例
定义华为p30为被观察者,并继承Observable类
1 /** 2 * @Author zch 3 * @Date 2019/8/20 4 */ 5 6 import java.util.Observable; 7 8 /** 9 * 定义华为手机:观察者 10 */ 11 public class HuaWeiP30 extends Observable { 12 13 //手机价格 14 private double money; 15 16 public HuaWeiP30(double money) { 17 this.money = money; 18 } 19 20 public void setMoney(double money) { 21 if(money != this.money){ 22 setChanged(); //价格改变 23 } 24 if(money < this.money){ 25 this.notifyObservers(); //通知观察者 26 } 27 this.money = money; 28 } 29 30 @Override 31 public String toString() { 32 return "当前华为手机P30价格:" + money + "元"; 33 } 34 }
定义华为粉丝为观察者,并实现Observer接口,并重写update(Observable o, Object arg)方法。
当观察者发现p30降价时,通知华为粉丝,提醒购买。
1 /** 2 * 华为粉丝:观察者 3 */ 4 public class HuaWeiFan implements Observer { 5 6 private String name; 7 8 public HuaWeiFan(String name) { 9 this.name = name; 10 } 11 12 /** 13 * 14 * @param o:被观察者对象 15 * @param arg:传递给观察者的参数 16 */ 17 public void update(Observable o, Object arg) { 18 if(o instanceof HuaWeiP30){ 19 System.out.println("粉丝名为" + name + "发现华为p30降价了,新的价格为:" + arg +"元,开始购买。"); 20 } 21 } 22 }
测试
1 public class App { 2 3 public static void main(String[] args) { 4 HuaWeiP30 p = new HuaWeiP30(5000); 5 6 HuaWeiFan A = new HuaWeiFan("A"); 7 HuaWeiFan B = new HuaWeiFan("B"); 8 HuaWeiFan C = new HuaWeiFan("C"); 9 HuaWeiFan D = new HuaWeiFan("D"); 10 11 p.addObserver(A); 12 p.addObserver(B); 13 p.addObserver(C); 14 15 System.out.println(p); 16 p.setMoney(4000); 17 System.out.println(p); 18 } 19 }
测试结果
当前华为手机P30价格:5000.0元 粉丝名为C发现华为p30降价了,新的价格为:4000.0元,开始购买。 粉丝名为B发现华为p30降价了,新的价格为:4000.0元,开始购买。 粉丝名为A发现华为p30降价了,新的价格为:4000.0元,开始购买。 当前华为手机P30价格:4000.0元