欢迎光临
我们一直在努力

设计模式-观察者模式

观察者模式是一种行为型设计模式,也被称为发布-订阅模式,它定义了一种一对多的依赖关系,当一个对象状态发生改变时,其所有的依赖对象都会得到通知并自动更新。

也就是说让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

ConcreteSubject 继承 Subject;ConcreteObserver 继承 Observer

优缺点:

优点
  • 低耦合、符合开闭原则发布者只依赖抽象观察者,新增 / 删除订阅者不用修改主题代码。
  • 一对多自动通知主题状态变化后,所有订阅者自动更新,不用手动逐个调用。
  • 动态订阅程序运行时可随时添加、移除观察者,灵活控制消息接收。
  • 广播机制复用一套发布订阅结构可复用在事件监听、消息推送等场景。
  • 缺点
  • 通知顺序不受控仅按注册顺序推送,没有原生优先级控制。
  • 容易循环触发观察者修改主题状态会反复触发通知,引发递归死循环。
  • 大量订阅者性能差同步遍历全部观察者,订阅对象极多时会阻塞、耗时。
  • 默认全量推送,无过滤原生不支持定向发送,需手动写判断过滤消息。
  • 内存泄漏风险忘记取消订阅时,主题持续持有观察者引用,对象无法被 GC 回收。
  • 举个例子

    你是一个实验室负责人,你要给学弟学妹定期留任务

    学弟学妹(监听任务通知,收到自动查看)

    抽象观察者 Observer

    public interface Observer {
    // 收到通知后执行更新
    void receiveTaskNotice(String taskMsg);
    }

    抽象主题 Subject

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

    public abstract class Subject {
    // 保存所有订阅的学弟学妹
    private List<Observer> studentList = new ArrayList<>();

    // 订阅(加学弟)
    public void subscribe(Observer observer) {
    studentList.add(observer);
    }

    // 取消订阅(退实验室)
    public void unsubscribe(Observer observer) {
    studentList.remove(observer);
    }

    // 广播通知所有人
    public void notifyAllStudent(String taskInfo) {
    for (Observer stu : studentList) {
    stu.receiveTaskNotice(taskInfo);
    }
    }
    }

    学长senior

    public class SeniorSubject extends Subject {
    // 发布任务,自动通知全部订阅学生
    public void publishTask(String taskContent) {
    System.out.println("学长发布新任务:" + taskContent);
    notifyAllStudent(taskContent);
    }
    }

    学弟学妹Student

    public class StudentObserver implements Observer {
    private String name;

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

    @Override
    public void receiveTaskNotice(String taskMsg) {
    System.out.println(name + " 收到任务通知,任务内容:" + taskMsg);
    }
    }

    public class Test {
    public static void main(String[] args) {
    // 创建发布者:学长
    SeniorSubject senior = new SeniorSubject();

    // 创建多个学弟学妹,订阅学长通知
    Observer stu1 = new StudentObserver("学弟A");
    Observer stu2 = new StudentObserver("学妹B");
    Observer stu3 = new StudentObserver("学弟C");
    senior.subscribe(stu1);
    senior.subscribe(stu2);
    senior.subscribe(stu3);

    // 学长发布任务,所有学生自动收到
    senior.publishTask("本周完成设计模式作业,周五提交");
    }
    }

    输出

    学长发布新任务:本周完成设计模式作业,周五提交
    学弟A 收到任务通知,任务内容:本周完成设计模式作业,周五提交
    学妹B 收到任务通知,任务内容:本周完成设计模式作业,周五提交
    学弟C 收到任务通知,任务内容:本周完成设计模式作业,周五提交

    适用场景

    1.发布者与订阅者需要解耦

    2.运行时可动态增减监听对象

    3.事件回调、消息广播场景

    4.无法预知有多少个接收方

    赞(0)
    未经允许不得转载:171主机测评 » 设计模式-观察者模式
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址