首页 > 其他分享 >观察者模式

观察者模式

时间:2023-04-12 20:33:52浏览次数:32  
标签:对象 comp Component 观察者 模式 组件 public

概述

《设计模式》一书中对于观察者模式的意图描述如下:

> 定义对象中的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都能得到通知并被更新

观察者模式的 UML 图如下所示:

observer_pattern.png

一般在以下情况下使用观察者模式:

  • 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这二者封装在独立的对象中,使得它们可以各自独立地改变和复用
  • 对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象需要改变
  • 一个对象必须通知其他对象,而它又不能假定其它对象是谁,也就是说,这些对象之间并不是耦合的

具体示例

对于一个多组件的页面来讲,这些组件之间是独立的。然而,有时候可能不得不将它们组合在一个页面中,统一响应对应的操作(如保存等),这些组件之间对于 “保存” 这一个操作的处理逻辑并不相同,因此需要每个组件进行隔离处理。对于页面来讲,它实际并不知道到底有多少个组件会被处理,在这种情况下,就很适合使用 “观察者模式” 来处理这一逻辑

首先,我们定义每个组件的抽象接口 Component

public interface Component { // 实际上这里的 Component 就相当于 Observer
    void saveInfo(); // 保存当前组件内的有关信息
}

对于页面来讲,实际上它就相当于每个组件订阅的主题(即 Subject),这可以是一个具体的实例类:

public class PageSubject {
    private final List<component> compList = new ArrayList&lt;&gt;();
    
    public void addComponent(Component comp) {
        compList.add(comp);
    }
    
    public void save() { // 当发起 “保存” 这一指令时,通知所有的观察者
        for (Component comp : compList) {
            comp.saveInfo();
        }
    }
}

总结

如果希望避免一对多的依赖对象的耦合关系,通过观察者模式可以有效地达到这一目的


参考:

[1] 《设计模式—可复用面向对象基础》

标签:对象,comp,Component,观察者,模式,组件,public
From: https://www.cnblogs.com/FatalFlower/p/17311139.html

相关文章

  • 【Visual Leak Detector】Release 模式下使用 VLD
    说明使用VLD内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍如何在Release模式下使用VLD。同系列文章目录可见《内存泄漏检测工具》目录目录说明1.思路概述2.在QT中实践1.思路概述要在RELEASE模式下使用VLD,必须在包含头文件vld.h前预先定义VLD_FORCE_E......
  • 02观察者模式
    让对象保持消息灵通需求一个WeatherData对象负责追踪目前的天气状况(温度,湿度,气压)。希望你们能建立一个应用,有三种布告板,分别显示目前的状况、气象统计及简单的预报。当WeatherObject对象获得最新的测量数据时,三种布告板必须实时更新。而且,这是一个可以扩展的气象站,Weather-O-Ra......
  • 74、混合模式—滤色
    原图   把两张图片选择【滤色】就可以了如果想把点点更加的明显,那么就对点点的图片进行【色阶】处理,并对【色阶】右键添加【剪切蒙版】,让它只对点点图片有影响,然后调节,让黑的更黑,白的更白 ......
  • 行为型:迭代器模式
    定义  迭代器模式提供一种方法按顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。迭代器模式是目的性极强的模式,它主要是用来解决遍历问题。es6中的迭代器  JS原生的集合类型数据结构,有Array(数组)和Object(对象),在ES6中,又新增了Map和Set。四种数据结构各自有......
  • openEuler 单机部署 Hadoop SingleNode 模式
    openEuler单机部署HadoopSingleNode模式升级操作系统和软件yum-yupdate升级后建议重启安装常用软件yum-yinstallgccgcc-c++autoconfautomakecmakemakersyncopenssh-servervimmanzipunzipnet-toolszlibzlib-developensslopenssl-develpcre-devel......
  • 六、WPF 动态设置菜单,非MVVM模式
     随手建了WPF窗口<Windowx:Class="WpfAppTest.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://sch......
  • 手搓观察者模式
    用专业的话来说,是这样的:观察者模式定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。用我自己的话说是这样的:法外狂徒张三欠了一屁股债,追债人不知道张三什么时候有钱还。但是张三是个很守信用的人,他一有了钱就会去通知追债人......
  • ip link add bond0 type bond 几种模式
    在使用命令iplinkaddbond0typebond创建Bond接口时,可以指定不同的Bond模式。常见的Bond模式有以下几种:mode=balance-rr:即Round-robin模式,是默认的Bond模式。在该模式下,数据包会按照轮流分发到不同的物理接口上,从而实现负载均衡。mode=active-backup:即Active......
  • 重学Java设计模式-行为型模式-责任链模式
    重学Java设计模式-行为型模式-责任链模式内容摘自:https://bugstack.cn/md/develop/design-pattern/2020-06-18-重学Java设计模式《实战责任链模式》.html#重学-java-设计模式-实战责任链模式「模拟618电商大促期间-项目上线流程多级负责人审批场景」责任链模式介绍图片来自......
  • .NET Core MongoDB数据仓储和工作单元模式实操
    前言MongoDB从入门到实战的相关教程YyFlight.ToDoList项目源码地址MongoDB事务使用前提说明创建EntityBase公共类添加UserInfo用户表实体映射模型创建用户Repository创建用户管理业务代码UserOperationExample控制创建注册数据库基础操作和工作单元注册相关应用服务......