• 设计模式之观察者模式ObserverPattern(十一)


    一、概述

            观察者模式 (Observer Pattern) 是一种行为型设计模式,又被称为发布-订阅 (Publish/Subscribe) 模式,它定义了对象之间的一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会自动收到通知并更新。

    二、结构

    在观察者模式中有如下角色:

    • Subject:观察对象,定义了注册观察者和删除观察者的方法。此外,它还声明了“获取现在的状态”的方法。
    • ConcreteSubject:具体观察对象,当自身状态发生变化后,它会通知所有已经注册的 Observer 角色。
    • Observer:抽象观察者,负责接收来自 Subject 角色的状态变化的通知,为此,它声明了 update 方法。
    • ConcrereObserver:具体观察者,当它的 update 方法被调用后,会去获取要观察的对象的最新状态。

    三、代码实现

    1、Observer

    1. package com.xu.demo.observerPattern;
    2. /**
    3. * 观察者接口
    4. */
    5. public interface Observer {
    6. void update(String message);
    7. }

    2、ConcreteObserver

     

    1. package com.xu.demo.observerPattern;
    2. /**
    3. * 观察者实例
    4. */
    5. public class ConcreteObserver implements Observer{
    6. private String name;
    7. public ConcreteObserver(String name) {
    8. this.name = name;
    9. }
    10. @Override
    11. public void update(String message) {
    12. System.out.println(name + ": " + message);
    13. }
    14. }

    3、Subject

    1. package com.xu.demo.observerPattern;
    2. /**
    3. * 主题接口
    4. */
    5. public interface Subject {
    6. //添加订阅者(观察者对象)
    7. void attach(Observer observer);
    8. //删除订阅者
    9. void detach(Observer observer);
    10. //通知订阅者更新消息
    11. void notify(String message);
    12. }

    4、SubscriptionSubject

     

    1. package com.xu.demo.observerPattern;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. /**
    5. * 主题操作类
    6. */
    7. public class SubscriptionSubject implements Subject{
    8. //定义一个集合,用来存储多个观察者对象
    9. private List observerList = new ArrayList<>();
    10. @Override
    11. public void attach(Observer observer) {
    12. observerList.add(observer);
    13. }
    14. @Override
    15. public void detach(Observer observer) {
    16. observerList.remove(observer);
    17. }
    18. @Override
    19. public void notify(String message) {
    20. //遍历集合
    21. for (Observer observer : observerList) {
    22. //调用观察者对象中的 update 方法
    23. observer.update(message);
    24. }
    25. }
    26. }

     5、ObserverPattern

     

     

    1. package com.xu.demo.observerPattern;
    2. public class ObserverPattern {
    3. public static void main(String[] args) {
    4. //1.创建主题对象
    5. SubscriptionSubject subject = new SubscriptionSubject();
    6. Observer ronnie = new ConcreteObserver("Ronnie");
    7. Observer ding = new ConcreteObserver("Ding");
    8. Observer trump = new ConcreteObserver("Trump");
    9. //2.观察者订阅主题
    10. subject.attach(ronnie);
    11. subject.attach(ding);
    12. subject.attach(trump);
    13. //3.更新主题
    14. subject.notify("Java专栏更新了!");
    15. System.out.println("====================我是分割线==================");
    16. //4.观察者取消订阅主题
    17. subject.detach(ding);
    18. subject.detach(trump);
    19. //5.更新主题
    20. subject.notify("Python专栏更新了!");
    21. }
    22. }

    运行结果:

    至此,一个最简单的 发布-订阅 (Publish/Subscribe) 模式代码实例就完成了,大家认真理解好好体会,你也能成为IT高手,我们下回再见。

  • 相关阅读:
    Oozie工作调度
    Python 基础合集2:字符串格式化
    yargs 简易指南:撸一个CLI
    2023/9/15 -- C++/QT
    小程序上新(2022.08.04~10.12)
    17、Java 的基类(Object 类)的方法介绍
    如何做好sop流程图?sop流程图用什么软件做?
    python3多进程和多线程使用场景如何区分
    ai神经网络滤镜安装包,ps神经网络滤镜安装包
    20231014后台面经总结
  • 原文地址:https://blog.csdn.net/u013521220/article/details/139494192