当前位置: 首页 > news >正文

23种设计模式中的观察者模式

定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。

观察者模式是一种发布-订阅模式。它让发送通知的一方(被观察者)和接收通知的一方(观察者)能够解耦,实现了对象之间的松耦合。

观察者模式的核心角色。

  1. Subject(主题/被观察者):维护观察者列表,提供添加、删除观察者的方法,以及通知观察者的方法。
  2. Observer(观察者):定义一个更新接口,用于在主题状态改变时接收通知。
  3. ConcreteSubject(具体主题):实现主题接口,存储具体状态,当状态改变时通知所有观察者。
  4. ConcreteObserver(具体观察者):实现观察者接口,维护一个指向具体主题的引用,存储与主题相关的状态。

下面是一个完整的观察者模式 Demo。

定义观察者接口。

public interface Observer {
    void update(String message);
}

定义主题接口。

public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers(String message);
}

实现具体主题。

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

public class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
    
    public void changeState(String newState) {
        System.out.println("Subject state changed to: " + newState);
        notifyObservers(newState);
    }
}

实现具体观察者。

public class ConcreteObserver implements Observer {
    private String name;
    
    public ConcreteObserver(String name) {
        this.name = name;
    }
    
    @Override
    public void update(String message) {
        System.out.println(name + " received message: " + message);
    }
}

执行测试代码,输出结果。

public class ObserverPatternDemo {
    public static void main(String[] args) {
        // 创建主题
        ConcreteSubject subject = new ConcreteSubject();
        
        // 创建观察者
        Observer observer1 = new ConcreteObserver("Observer 1");
        Observer observer2 = new ConcreteObserver("Observer 2");
        Observer observer3 = new ConcreteObserver("Observer 3");
        
        // 注册观察者
        subject.registerObserver(observer1);
        subject.registerObserver(observer2);
        subject.registerObserver(observer3);
        
        // 改变主题状态,观察者会收到通知
        subject.changeState("State 1");
        
        // 移除一个观察者
        subject.removeObserver(observer2);
        
        // 再次改变状态
        subject.changeState("State 2");
    }
}

可以看到,只要主题类发生变更,依赖于它的观察者都会收到通知并进行相应的更新。

总结

观察者模式。将主题和观察者解耦,实现了对象之间的松耦合。是一种一对多的通知机制,使得双方无需关心对方,只关心通知本身。

相关文章:

  • 26考研 | 王道 | 数据结构 | 第五章 树
  • mybatis plus 实体类基于视图,更新单表的时候报视图或函数‘v_视图名‘不可更新,因为修改会影响多个基表的错误的简单处理方法。
  • 基于BP神经网络的杂草智能识别系统(杂草识别、Python项目)
  • mac安装浏览器闪退处理
  • 【ARTS】【LeetCode-2873】有序三元组中的最大值!
  • 计算机系统--- BIOS(基本输入输出系统)
  • 内网渗透-MySQL提权
  • Java面试黄金宝典38
  • 一周学会Pandas2 Python数据处理与分析-NumPy数组属性
  • 不用训练,集成多个大模型产生更优秀的输出
  • 4.4刷题记录(哈希表)
  • 游戏引擎学习第208天
  • 前端快速入门学习4——CSS盒子模型、浮动、定位
  • 计算机视觉5——运动估计和光流估计
  • 插入排序详细讲解
  • modprobe: can‘t open ‘modules.dep‘: No such file or directory
  • JAVA反序列化深入学习(十三):Spring2
  • 多元高斯分布函数
  • Java中String、Array、List的相互转换工具类
  • java实用工具类Localstorage
  • 做网站容易还是app容易/竞价外包代运营公司
  • 做泌尿科网站价格/新闻头条最新消息今天
  • 深圳网站建设制作设计/公司员工培训方案
  • 岳阳做公司网站/百度的首页
  • 怎么用phpcmf做网站/搜索引擎营销的特征
  • 怎么做微信网站/广州网站开发多少钱