atwood-pan

 

13-设计模式——观察者模式

设计模式——观察者模式

观察者模式 ==> Observer

模式定义:

定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者都会收到通知更新

Class Diagram

主题(Subject)具有注册(register)和移除(remove)观察者、并通知(notify)所有观察者的功能,主题是通过维护一张观察者列表来实现这些操作的。

观察者(Observer)的注册功能需要调用主题的 registerObserver() 方法。

LQsNY4.png

应用场景:

当更改一个对象的状态可能需要更改其他对象,并且实际的对象集实现未知或动态更改时

优点:

  1. 符合开闭原则
  2. 可以在运行时建立对象之间的关系
* java.util.Observable
* org.springframework.context.ApplicationListener
package com.example.designpatterns.observer;

import java.util.ArrayList;
import java.util.List;

/**
 * @program: DesignPatterns
 * @description: 观察者模式 - Observer
 * java.util.Observable
 * org.springframework.context.ApplicationListener
 * @author: Coder_Pan
 * @create: 2022-04-14 09:08
 **/
public class ObserverTest {

    public static void main(String[] args) {
        System.out.println("观察者模式......");
        //1、初始化主题对象
        Subject subject = new Subject();
        //2、创建两个观察者
        Task1 task1 = new Task1();
        subject.addObserver(task1);
        Task2 task2 = new Task2();
        subject.addObserver(task2);
        //3、发送通知
        subject.notifyObserver("发送通知!!!!!");
    }
}

/**
 * 主题对象
 */
class Subject {
    /**
     * 容器 => 容器中存放若干个观察者
     */
    private List<Observer> containers = new ArrayList<Observer>();
    /**
     * add => 注册观察者
     */
    public void addObserver(Observer observer){
        containers.add(observer);
    }
    /**
     * remove => 移除观察者
     */
    public void removeObserver(Observer observer) {
        containers.remove(observer);
    }
    /**
     * 数据发生变化时,需发送通知
     */
    public void notifyObserver(Object obj) {
        /**
         * 循环通知每一个观察者
         */
        for (Observer item : containers) {
            item.update(obj);
        }
    }
}

/**
 * 观察者
 */
interface Observer {
    /**
     * 主题更新
     * @param obj
     */
    void update(Object obj);
}

/**
 * 创建任务1 对象
 */
class Task1 implements Observer{

    @Override
    public void update(Object obj) {
        System.out.println( " task1===============>" + obj);
    }
}
/**
 * 创建任务2 对象
 */
class Task2 implements Observer{

    @Override
    public void update(Object obj) {
        System.out.println( " task2===============>" + obj);
    }
}

posted on 2022-04-14 09:33  JavaCoderPan  阅读(12)  评论(0编辑  收藏  举报  来源

导航