• 观察者模式Observer


    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11409319.html

    1. 定义
    定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

    2. 结构图

    Subject:目标对象,通常具有如下功能。

    • 一个目标可以被多个观察者观察。
    • 目标提供对观察者注册和退订的维护。
    • 当目标的状态发生变化时,目标负责通知所有注册的、有效的观察者。

    Observer:定义观察者的接口,提供目标通知时对应的更新方法,这个更新方法进行相应的业务处理,可以在这个方法里面回调目标对象,以获取目标对象的数据。
    ConcreteSubject:具体的目标实现对象,用来维护目标状态,当目标对象的状态发生改变时,通知所有注册的、有效的观察者,让观察者执行相应的处理。
    ConcreteObserver:观察者的具体实现对象,用来接收目标的通知,并进行相应的后续处理,比如更新自身的状态以保持和目标的相应状态一致。

    3. 本质
    观察者模式的本质:触发联动。

    4. Code Demo

    Observer.java

    1 package org.fool.dp.observer;
    2 
    3 public interface Observer {
    4     void update(String str);
    5 }

    ConcreteObserver.java

    1 package org.fool.dp.observer;
    2 
    3 public class ConcreteObserver implements Observer {
    4     @Override
    5     public void update(String str) {
    6         System.out.println(str);
    7     }
    8 }

    Subject.java

    1 package org.fool.dp.observer;
    2 
    3 public interface Subject {
    4     void addObserver(Observer observer);
    5 
    6     void removeObserver(Observer observer);
    7 
    8     void notifyObservers(String str);
    9 }

    ConcreteSubject.java

     1 package org.fool.dp.observer;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 public class ConcreteSubject implements Subject {
     7     private List<Observer> observerList = new ArrayList<>();
     8 
     9     @Override
    10     public void addObserver(Observer observer) {
    11         observerList.add(observer);
    12     }
    13 
    14     @Override
    15     public void removeObserver(Observer observer) {
    16         observerList.remove(observer);
    17     }
    18 
    19     @Override
    20     public void notifyObservers(String str) {
    21         for (Observer observer : observerList) {
    22             observer.update(str);
    23         }
    24     }
    25 }

    Test.java

     1 package org.fool.dp.observer;
     2 
     3 public class Test {
     4     public static void main(String[] args) {
     5         Subject subject = new ConcreteSubject();
     6 
     7         Observer observer1 = new ConcreteObserver();
     8         Observer observer2 = new ConcreteObserver();
     9         Observer observer3 = new ConcreteObserver();
    10 
    11         subject.addObserver(observer1);
    12         subject.addObserver(observer2);
    13         subject.addObserver(observer3);
    14 
    15         subject.notifyObservers("hello world");
    16 
    17         subject.removeObserver(observer2);
    18 
    19         subject.notifyObservers("hello");
    20     }
    21 }
  • 相关阅读:
    confluence重置admin密码
    oracle 11g密码永不过期
    GCC编译器使用
    Emacs常用命令汇总
    bash shell命令(1)
    进程管理3--经典的进程同步问题
    进程管理2--进程的同步与信号量
    C安全问题与指针误用
    C迷途指针
    进程管理1--进程的概念与操作
  • 原文地址:https://www.cnblogs.com/agilestyle/p/11409319.html
Copyright © 2020-2023  润新知