zoukankan      html  css  js  c++  java
  • 观察者模式(一)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元
  • 相关阅读:
    回发保留前台添加的html
    关于NBear数据访问层IDData
    使用js把数字转化成会计格式
    二次注入
    .htaccess利用与Bypass方式总结
    HTTPoxy漏洞(CVE-2016-5385)
    JAVA并行程序基础一
    队列-数组实现
    Vuex
    稀疏数组
  • 原文地址:https://www.cnblogs.com/zchok/p/11384485.html
Copyright © 2011-2022 走看看