观察者模式(一)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元
原文地址:https://www.cnblogs.com/zchok/p/11384485.html