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

行为模式4.观察者模式------消息推送

 行为型模式

  1. 模板方法模式(Template Method Pattern)
  2. 命令模式(Command Pattern)
  3. 迭代器模式(Iterator Pattern)
  4. 观察者模式(Observer Pattern)
  5. 中介者模式(Mediator Pattern)
  6. 备忘录模式(Memento Pattern)
  7. 解释器模式(Interpreter Pattern)
  8. 状态模式(State Pattern)
  9. 策略模式(Strategy Pattern)
  10. 职责链模式(Chain of Responsibility Pattern)
  11. 访问者模式(Visitor Pattern)

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

  1. Subject(主题):也称为“被观察者”,它是状态发生变化的对象,负责管理观察者列表并向其发送通知。
  2. Observer(观察者):是依赖于主题对象的对象,它在主题对象发生变化时收到通知并进行相应的更新。
  3. ConcreteSubject(具体主题):实现了Subject接口,持有状态,并在状态改变时通知观察者。
  4. ConcreteObserver(具体观察者):实现了Observer接口,根据主题状态的变化更新自己。

观察者模式的工作流程

  1. 注册观察者:观察者通过attach()方法注册到主题对象上。
  2. 状态变化:主题对象的状态发生变化时,通过notifyObservers()通知所有注册的观察者。
  3. 更新观察者:每个观察者调用update()方法来响应主题的状态变化。

观察者模式的优点

  • 松耦合:主题和观察者之间只通过接口进行交互,减少了它们之间的耦合度,主题和观察者之间的关系是动态的,可以方便地添加和删除观察者。
  • 易于扩展:增加新的观察者非常方便,无需修改主题类的代码,只需要实现Observer接口即可。
// 观察者接口,所有具体观察者都需要实现这个接口
interface Observer {
    void update(String message);  // 当主题发生变化时,通知观察者
}

// 具体观察者,处理主题变化时的具体操作
class ConcreteObserver implements Observer {
    private String observerName;

    public ConcreteObserver(String name) {
        this.observerName = name;
    }

    @Override
    public void update(String message) {
        System.out.println(observerName + " 收到消息: " + message);
    }
}

// 主题接口,定义了观察者注册、注销和通知的操作
interface Subject {
    void attach(Observer observer);  // 添加观察者
    void detach(Observer observer);  // 移除观察者
    void notifyObservers();          // 通知所有观察者
}

// 具体主题,管理观察者并发出通知
class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String state;

    // 设置状态,并通知观察者
    public void setState(String state) {
        this.state = state;
        notifyObservers();  // 当状态变化时,通知所有观察者
    }

    public String getState() {
        return state;
    }

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

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

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update("主题状态已更改为: " + state);
        }
    }
}

// 测试代码
public class ObserverPatternDemo {
    public static void main(String[] args) {
        // 创建主题和观察者
        ConcreteSubject subject = new ConcreteSubject();
        Observer observer1 = new ConcreteObserver("观察者1");
        Observer observer2 = new ConcreteObserver("观察者2");
        Observer observer3 = new ConcreteObserver("观察者3");

        // 注册观察者
        subject.attach(observer1);
        subject.attach(observer2);
        subject.attach(observer3);

        // 改变主题的状态,通知所有观察者
        System.out.println("改变主题状态为 '状态1'");
        subject.setState("状态1");

        // 移除一个观察者
        subject.detach(observer2);

        // 改变主题的状态,通知剩余观察者
        System.out.println("\n改变主题状态为 '状态2'");
        subject.setState("状态2");
    }
}


http://www.kler.cn/a/467122.html

相关文章:

  • 【JVM】总结篇-类的加载篇之 类的加载器 和ClassLoader分析
  • 常用的数据结构API概览
  • 数据挖掘——集成学习
  • 【Rust自学】10.3. trait Pt.1:trait的定义、约束与实现
  • 【Vim Masterclass 笔记08】第 6 章:Vim 中的文本变换及替换操作 + S06L20:文本的插入、变更、替换,以及合并操作
  • 【工具类】RedisUtil 操作相关
  • LangChain+博查搜索API轻松实现实时信息搜索
  • 【每日学点鸿蒙知识】ASON工具、自定义tabbar、musl、Text异常截断等
  • 【C语言】可移植性陷阱与缺陷(五): 移位运算符
  • 初学stm32 --- 存储器类型
  • 文献阅读 250104-Overconfidence in climate overshoot
  • 文件上传漏洞利用与绕过姿势总结
  • 【大模型】ChatGPT 数据分析与处理使用详解
  • SQL 基础教程 - SQL SELECT 语句
  • 部署项目添加工程名的步骤
  • 哈希算法详解及案例应用
  • Jurgen提出的Highway Networks:LSTM时间维方法应用到深度维
  • Java:缓存:LinkedHashMap实现Lru
  • 【C++】开源:Armadillo数值计算库配置与使用
  • 第28天:PHP应用Cookie脆弱Session固定Token唯一身份验证数据库通讯
  • 一文理解Vue.js 与 Vue Router:构建现代单页面应用
  • Maven 详细配置:Maven settings 配置文件的详细说明
  • vue3 css实现文字输出带光标显示,文字输出完毕,光标消失的效果
  • 145页PPT智慧矿山整体规划建设方案
  • cesium小知识:3D tiles 概述、特点、示例
  • 计算机网络复习(大题)