首页 > 其他分享 >【设计模式基础版】观察者模式

【设计模式基础版】观察者模式

时间:2024-08-25 20:23:21浏览次数:13  
标签:observer Observer void 观察者 模式 设计模式 public name

观察者模式(Observer Pattern)是一种**行为型设计模式**,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者(观察者)都会收到通知并自动更新。观察者模式常用于需要自动通知多个对象状态变化的场景,例如事件处理系统、订阅-发布系统等。所以也被称作“发布-订阅模式”。

观察者模式的结构

观察者模式包含以下几个核心角色:

  1. 主题(Subject):被观察的对象,维护一个观察者列表,并提供添加、删除和通知观察者的方法。
  2. 观察者(Observer):接收通知并进行相应更新的对象,通常定义一个更新方法。
  3. 具体主题(Cocrete Subject):主题的具体实现类·,当状态发生变化时通知所有观察者。
  4. 具体观察者(Concrete Observer):观察者的具体实现类,实现更新方法以响应主题的通知。

观察者模式的实现

举例:以下是一个简单的 Java 示例,展示如何实现观察者模式:

1. 定义观察者接口
public interface Observer {
    void update();
}
2. 实现具体观察者类
public class ConcreteObserver implements Observer {
    private String name;

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

    @Override
    public void update() {
        System.out.println(name + " received update");
    }
}
3. 定义主题接口
public interface Subject {
    void attach(Observer observer);
    void detach(Observer observer);
    void notifyObservers();
}
4. 实现具体主题类
public class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();
    //添加观察者
    @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();
        }
    }

    public void changeState() {
        // 状态改变逻辑
        notifyObservers();
    }
}
5. 使用观察者模式
public class Test {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();

        Observer observer1 = new ConcreteObserver("观察者 1");
        Observer observer2 = new ConcreteObserver("观察者 2");

        subject.attach(observer1);
        subject.attach(observer2);

        subject.changeState(); // 通知所有观察者
    }
}
6.打印

在这里插入图片描述

优点和缺点

优点

  • 解耦:观察者和主题之间是抽象耦合的,增加新的观察者不需要修改主题代码。
  • 灵活性:可以在运行时动态添加或删除观察者。

缺点

  • 性能问题:如果观察者众多,通知过程可能耗时。
  • 循环依赖:可能导致循环调用和系统崩溃。
  • 变化详情缺乏:观察者不知道主题如何变化,只知道变化发生。

使用场景

  • 当一个对象的状态变化需要同时更新其他对象时。
  • 发布-订阅系统,例如事件处理系统、消息队列等。

标签:observer,Observer,void,观察者,模式,设计模式,public,name
From: https://blog.csdn.net/m0_68120707/article/details/141534192

相关文章

  • 设计模式——六大原则
    一、六大设计原则1.单一职责原则:应该有且仅有一个原因引起类的变更2.里氏替换原则:子类可替换父类。a)子类必须完全实现父类的方法b)子类可以有自己的个性c)子类实现父类方法时,入参可放大d)子类实现父类方法时,输出参数可缩小3.依赖倒置原则:高层模块......
  • 二十三种模式之抽象工厂模式
    1.设计模式的分类创建型模式(五种):工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。结构型模式(七种):适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。行为型模式(十一种):状态模式、模板方法模式、访问者模式、迭代子模式、责任链......
  • Java行为型设计模式-访问者模式(含二叉树场景示例)
    1.访问者模式简介访问者模式(VisitorPattern)是一种行为型设计模式,其主要目的是将数据结构与数据操作解耦。用于将数据结构和在数据结构上的操作分离开来。‌这种模式允许在不修改数据结构的情况下,定义新的操作。2.访问者模式角色访问者模式的主要角色包括:2.1抽象访问......
  • 在C#中应用命令模式:设计和实现的最佳实践
    在C#中应用命令模式:设计和实现的最佳实践引言在软件设计中,设计模式是解决常见问题的通用解决方案。命令模式(CommandPattern)是行为型设计模式之一,它将请求或操作封装为对象,从而使得你可以用不同的请求对客户端进行参数化,队列请求或记录请求日志,以及支持可撤销的操作。在C#......
  • ZBlog强制开启 Debug 调试模式
    常规开启调试模式是在后台设置中进行,在后台设置的全局设置里打开“调试模式”并保存即可。如果网站程序出错,不能进入后台进行设置,那么在1.7.3及更高版本可以在这样设置:使用空间面板的文件管理或者FTP修改文件:path/zb_users/c_option.php;'ZC_DEBUG_MODE'=>true,//开启Deb......
  • 基于开源 AI 智能名片链动 2+1 模式微信拓客小程序的会员推荐酬谢策略
    摘要:本文旨在探讨在当前数字化营销环境下,如何利用开源AI智能名片链动2+1模式微信拓客小程序,有效地酬谢老会员的推荐行为,以实现门店的业务增长和客户拓展。通过分析老会员推荐的重要性,结合积分酬谢方式以及与“三级分销”概念的区别,提出了一套切实可行的酬谢策略,为门店的经......
  • 设计模式篇(DesignPattern - 前置知识 & 七大原则)(持续更新调整)
    目录前置知识一、什么是设计模式二、设计模式的目的七大原则原则一:单一职责原则一、案例一:交通工具问题1.问题分析2.解决思路2.1类级别单一职责2.2方法级别单一职责3.知识小结二、案例二:待更新原则二:接口隔离原则一、案例一:大接口拆分小接口1.问题分析2.......
  • 突破编程:C++中的组合模式(Composite Pattern)
    突破编程:C++中的组合模式(CompositePattern)在软件设计领域,组合模式(CompositePattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式让客户端代码可以一致地处理单个对象和组合对象,无需关心对象的具体类型,从而简化了客户端代码......
  • 工厂模式和策略模式区别
    工厂模式和策略模式是两种常见且重要的设计模式,它们在软件开发中各自扮演着不同的角色,具有显著的区别和各自的应用场景。以下将详细阐述这两种模式的区别,包括定义、结构、应用场景、优缺点等方面,以满足不少于2000字的要求。一、定义与结构1.工厂模式工厂模式(FactoryPat......
  • 设计模式反模式:UML图示常见误用案例分析
    设计模式反模式:UML图示常见误用案例分析在软件开发过程中,设计模式(DesignPatterns)作为解决常见设计问题的最佳实践,被广泛地应用于提高代码质量和可维护性。然而,当这些设计模式被误用或滥用时,它们可能会变成反模式(Anti-Patterns),导致系统架构的复杂性增加,甚至引发一系列问题......