设计模式之观察者模式

观察者模式概念

它允许一个对象(称为"主题"或"被观察者")在其状态发生变化时通知多个观察者对象,从而实现对象之间的解耦。这种模式常用于实现事件处理机制和发布/订阅模式。

观察者模式的基本概念

Subject(主题)

主题也称为被观察者,负责维护一个观察者列表,并在状态发生变化时通知所有观察者。

Observer(观察者)

观察者负责监听主题的状态变化,并在收到通知时更新自己。

观察者模式的主要组成部分

Subject(主题)

维护一个观察者列表。

提供注册和注销观察者的方法。

提供通知观察者的方法。

Observer(观察者)

定义一个更新的方法,当主题状态发生变化时被调用。

ConcreteSubject(具体主题)

实现Subject接口,维护一个观察者列表,并在状态发生变化时通知所有观察者。

ConcreteObserver(具体观察者)

实现Observer接口,定义具体的更新逻辑。

举个栗子:

老师想通知学生明天老师不上课,老师找到班长把这个消息给班长说了一下,班长接着通知班里的每个学生。

流程

学生进入老师班级==>老师通知班长消息==>班长通知每个学生

4.代码实现

1)Observer观察者类

java 复制代码
package org.xiji.observer2;

/**
 * 订阅者类
 */
public interface Observer {
    /**
     *
     * 接受消息
     */
    void getMessage(Teacher teacher);
}

2)Subject主题类

java 复制代码
package org.xiji.observer2;

/**
 * 发布者类
 */
public interface Subject2 {

    /**
     * 注册
     */
    void register(Student student);

    /**
     * 移除
     */
    void remove(Student student);

    /**
     * 通知
     */
    void notifyStudent();

}

3)Student类

java 复制代码
package org.xiji.observer2;

public class Student implements Observer{
    private String name;

    public Student(String name)
    {
        this.name = name;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    /**
     * 接受老师的消息
     *
     */

    @Override
    public void getMessage(Teacher teacher) {
        System.out.println(name + "接到通知:" + teacher.getMessage());
    }
}

4)teacher类

java 复制代码
package org.xiji.observer2;

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

/**
 * 教师发布消息
 */
public class Teacher implements Subject2 {
    /**
     * 通知消息
     */
    private String message;
    /**
     * 班级学生集合
     */
    private List<Student> students=new ArrayList<>();

    public Teacher() {
    }

    public Teacher(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    /**
     * 修改订阅信息
     *
     */
    public void setMessage(String message) {
        this.message = message;
        //通知学生
        this.notifyStudent();
    }


    @Override
    public void register(Student student) {
        students.add(student);
        System.out.println("学生:"+student.getName()+"注册成功");
    }

    @Override
    public void remove(Student student) {
        students.remove(student);

    }

    /**
     * 这个方法相当于班长通知学生
     */
    @Override
    public void notifyStudent() {
        /**
         * 通知每个学生
         */
        for (Student student : students) {
            student.getMessage(this);
        }

    }
}

5)观察者测试类

java 复制代码
package org.xiji.observer2;

import java.util.Scanner;

/**
 * 订阅者模式
 */
public class Observer2Main {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();

        Student student1 = new Student("小久");
        Student student2 = new Student("张三");
        Student student3 = new Student("惜己");

        teacher.register(student1);
        teacher.register(student2);
        teacher.register(student3);

        //创建io流
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("请输入通知内容:");
            String message = scanner.nextLine();
            teacher.setMessage(message);

        }


    }
}

6)测试结果

相关推荐
MY_TEUCK30 分钟前
【Java 后端】SpringBoot 登录认证与会话跟踪实战(JWT + Filter/Interceptor)
java·开发语言·spring boot
今天长肉了吗40 分钟前
银行风控项目踩坑实录:指标跑了6小时,风险评分全挂了
java
随读手机1 小时前
多式联运信息交互平台完整方案(2026版)
java·ai·eclipse·云计算·区块链
许彰午2 小时前
03-二叉树——从递归遍历到非递归实现
java·算法
nj01282 小时前
Spring 循环依赖详解:三级缓存、早期引用、AOP 代理与懒加载
java·spring·缓存
野生技术架构师2 小时前
2026年最全Java面试题及答案汇总(建议收藏,面试前看这篇就够了)
java·开发语言·面试
一只叫煤球的猫3 小时前
ThreadForge 源码解读一:ThreadScope 如何把并发任务放进清晰边界?
java·面试·开源
ximu_polaris3 小时前
设计模式(C++)-行为型模式-中介者模式
c++·设计模式·中介者模式
洛_尘3 小时前
Python 5:使用库
java·前端·python
程序员小假4 小时前
HTTP3 性能更好,为什么内网微服务依然多用 HTTP2?HTTP2 内网优势是什么?
java·后端