• 行为类模式(七):观察者(Observer)


    定义

    定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

    UML

    优点

    1. 观察者和被观察者之间是松耦合的,分别可以各自独立改变。
    2. Subject在发送广播通知的时候,无须指定具体的Observer,Observer可以自己决定是否要订阅Subject的通知。
    3. 遵守大部分GRASP原则和常用设计原则,高内聚、低耦合。

    缺点

    1. 松耦合导致代码关系不明显,有时可能难以理解。
    2. 如果一个对象被大量观察者订阅的话,在广播通知的时候可能会有效率问题。(毕竟只是简单的遍历)

    应用场景

    1. 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
    2. 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。

    示例

    实现一个简单的观察者和被观察者的示例。

    Java

     1 import java.util.ArrayList;
     2 import java.util.List;
     3 
     4 public class Main
     5 {
     6     public static void main(String[] args)
     7     {
     8         Subject sub = new ConcreteSubject();
     9         sub.addObserver(new ConcreteObserver1()); //添加观察者1
    10         sub.addObserver(new ConcreteObserver2()); //添加观察者2
    11         sub.doSomething();
    12     }
    13 
    14     /**
    15      * 观察则接口
    16      */
    17     public interface Observer
    18     {
    19         void update();
    20     }
    21 
    22     /**
    23      * 被观察者基类
    24      */
    25     public static abstract class Subject
    26     {
    27         private List<Observer> obs = new ArrayList<>();
    28 
    29         public void addObserver(Observer obs)
    30         {
    31             this.obs.add(obs);
    32         }
    33 
    34         public void delObserver(Observer obs)
    35         {
    36             this.obs.remove(obs);
    37         }
    38 
    39         protected void notifyObserver()
    40         {
    41             for (Observer o : obs)
    42             {
    43                 o.update();
    44             }
    45         }
    46 
    47         public abstract void doSomething();
    48     }
    49 
    50     /**
    51      * 观察者对象1
    52      */
    53     public static class ConcreteObserver1 implements Observer
    54     {
    55         public void update()
    56         {
    57             System.out.println("观察者1收到信息,并进行处理。");
    58         }
    59     }
    60 
    61     /**
    62      * 观察者对象2
    63      */
    64     public static class ConcreteObserver2 implements Observer
    65     {
    66         public void update()
    67         {
    68             System.out.println("观察者2收到信息,并进行处理。");
    69         }
    70     }
    71 
    72     /**
    73      * 具体的被观察者
    74      */
    75     public static class ConcreteSubject extends Subject
    76     {
    77         public void doSomething()
    78         {
    79             System.out.println("被观察者事件反生");
    80             this.notifyObserver();
    81         }
    82     }
    83 }
    View Code
  • 相关阅读:
    小程序支付
    小程序传参
    git
    学习过程遇到问题的解决方法
    进程创建注意事项:函数及对应包
    进程创建:函数及对应包
    mac解决eclipse 端口占用问题
    暴力
    doc2vec
    Java正则表达式的解释说明
  • 原文地址:https://www.cnblogs.com/hammerc/p/4743810.html
Copyright © 2020-2023  润新知