Java设计模式 _行为型模式_观察者模式

一、观察者模式

1、观察者模式

观察者模式 ( Observer Pattern )是一种行为型模式。 常用于对象间存在一对多关系时,比如,当一个对象被修改时,需要自动通知它的依赖对象。

2、实现思路

(1)、定义被观察者的行为(包含业务数据,观察者列表,添加观察者的方法,通知观察者的方法等)。定义规范后,在编写实现类。本例直接编写了实现类。

(2)、编写观察者的行为和实现类。(行为:将自身添加到主题的属性中,复写接收数据的方法)

二、代码示例

1、示例场景

多个观察者观察一个主题,主题发生改变时,促发各个观察者自身的业务方法。
2、代码示例

java 复制代码
// 1、定义主题(被观察者)
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class Subject {
    private String data;
    List<Observer> observerList;   // 观察者列表

    public Subject() {
        observerList = new ArrayList<>();
    }

    public void setData(String data) {   // 发布消息,通知所有观察者
        this.data = data;
        System.out.println("发布了消息:"+this.data);
        notifyAllObser();
    }

    public void addObserver(Observer observer) {  // 添加观察者
        observerList.add(observer);
    }

    public void notifyAllObser() {   // 通知观察者
        for (Observer observer : observerList) {
            observer.getSubData();
        }
    }
}
// 2、定义观察者规范
public abstract class Observer {
    public Subject subject;
    public abstract void getSubData();
}
// 3.1、编写观察者实现类,记者类
public class Reporter extends Observer {
    public Reporter(Subject subject) {
        this.subject = subject;
        this.subject.addObserver(this);
    }

    @Override
    public void getSubData() {
        System.out.println("记者观察到消息:" + subject.getData());
    }
}
// 3.2、编写观察者实现类,厨师类
public class Cooker extends Observer {
    public Cooker(Subject subject) {
        this.subject = subject;
        this.subject.addObserver(this);
    }

    @Override
    public void getSubData() {
        System.out.println("厨师观察到消息:" + subject.getData());
    }
}
// 4、测试
public static void main(String[] args) {
        Subject subject = new Subject();
        Observer observer1 = new Reporter(subject);
        Observer observer2 = new Cooker(subject);

        subject.setData("1111");
        System.out.println("************");
        subject.setData("2222");
    }

由上图可看到,当主题发布消息后,该主题对象的观察者集合中的每一个人都可以接收到消息。

总结:

观察者模式往往用于一对多的场景,主要套路为你中有我,我中有你。所以代码上要把观察者内置到被观察者的属性中(列表),被观察者也要内置到观察者中,彼此定义了对方的属性,之后封装数据可以是构造方法实现,也可以是自定义方法等。形成这种关系后,当被观察者发生改变时,就可以把被观察者的业务消息通知到内置的观察者列表中,通常是直接调用观察者的方法实现。

学海无涯苦作舟!!!

相关推荐
代码充电宝41 分钟前
LeetCode 算法题【简单】283. 移动零
java·算法·leetcode·职场和发展
StevenGerrad4 小时前
【读书笔记】架构整洁之道 P2~3 编程范式&设计原则
设计模式·架构·软件工程
ccccczy_4 小时前
Spring Security 深度解读:JWT 无状态认证与权限控制实现细节
java·spring security·jwt·authentication·authorization·securityfilterchain·onceperrequestfilter
Lin_Aries_04214 小时前
容器化 Tomcat 应用程序
java·linux·运维·docker·容器·tomcat
sheji34164 小时前
【开题答辩全过程】以 springboot高校社团管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
zzywxc7874 小时前
大模型落地实践指南:从技术路径到企业级解决方案
java·人工智能·python·microsoft·golang·prompt
相与还4 小时前
IDEA+SpringBoot实现远程DEBUG到本机
java·spring boot·intellij-idea
小杨勇敢飞4 小时前
IDEA 2024 中创建 Maven 项目的详细步骤
java·ide·intellij-idea
野犬寒鸦5 小时前
从零起步学习Redis || 第四章:Cache Aside Pattern(旁路缓存模式)以及优化策略
java·数据库·redis·后端·spring·缓存
白水先森5 小时前
C语言作用域与数组详解
java·数据结构·算法