• 设计模式一: Observer(观察者模式)


    1. 预备知识

    1.0 设计原则和设计模式

    1.1 如何描述设计模式

    在本系列文章中,我们将用统一的格式描述设计模式,每一个模式根据以下的模板被分为若干部分描述。

    模式名和分类:
    模式名称简介地描述了模式的本质,比如观察者模式、迭代器模式,等等。

    意图:
    主要回答以下问题:

    • 这是模式是做什么的
    • 它的基本原理和意图是什么
    • 它可以解决怎样特定的设计问题

    别名:
    模式的其他名称

    适用性:

    • 什么情况下可以使用该设计模式?
    • 该模式可用来改进哪些不良的设计,怎么识别这些情况

    结构:
    基于OMT表示法对模式中的类进行图形化描述。 OMT表示法见2.0

    参与者:
    抽象化地描述设计模式中的类和对象以及各自的职责

    协作:
    模式的不同参与者怎么样协作实现他们的职责

    效果:

    • 模式怎么样支持它的目标
    • 效果和工作量的权衡
    • 系统结构的哪些方面可以独立改变

    代码示例:
    基于C++语言的代码示例,所有代码开源,且使用gitee管理
    这是代码gitee地址

    已知应用:
    实际系统中应用该模式的例子

    相关模式:

    • 与这个模式紧密相关的模式有哪些
    • 不同之处是什么
    • 这个模式与哪些其他的模式一起使用

    1.3 图示符号指南

    主要使用以下三种图描述类和对象间的关系和交互。

    • 类图:描述各个类的结构及静态关系
    • 对象图:描述运行时刻特定的对象结果
    • 交互图:展示对象间请求的流程

    1.3.1 类图

    1. 类。
      使用OMT表示法表示类图
      抽象类和具体类
    • 一个类表示为一个线框,在顶部以粗体写着类名,其下是主要的操作,在下是实例变量。
    • 斜体表示类的操作是抽象的
    1. 继承:Shape(父类)与LineShape(子类)表示类继承关系,用空心三角形,在连接线中间表示。
    2. 组合 的含义是一个类中具有另一个类的成员变量,被组合的对象生命周期同组合他的对象一致,即“同生共死”。C++代码为:
    class Drawing
    {
    	Shape ShapeVar;
    }
    
    • 1
    • 2
    • 3
    • 4

    在OMT中用根部有菱形的箭头表示,其中箭头的指向为成员变量。
    在这里插入图片描述

    4.聚合(部分书翻译为相识)。一个类只是“知道”另一个类,但是对于他的生命周期完全不关心(这点看笔者认为“相识”的翻译更能让人领会意思)。C++代码为:

    class LineShape
    {
    	Color* ColorVar;
    }
    
    • 1
    • 2
    • 3
    • 4

    在OMT中,根部没有菱形的箭头表示聚合关系
    在这里插入图片描述
    5.多于一个
    OMT还定义了一种实心圆点,表示“多于一个”:
    在这里插入图片描述
    例如上图表示Drawing 类有多个Shape类型的成员变量,同shape成员变量之间是组合厝
    6.创建
    还有一种需要表示的关系是“一个类创建了哪个类的对象”,但书中说OMT并不支持这种表示,因此书中自己用虚线表示了这种关系:
    在这里插入图片描述
    如图表示CreationTool创建了LineShape类型的对象
    7. 伪代码注解
    在这里插入图片描述

    一个例子:
    在这里插入图片描述

    1. Drawing类有成员变量Shape(可能有多个),二者构成组合关系
    2. Shape为父类,LineShape为子类,其中LineShape有指向Color类的指针,构成聚合关系
    3. CreationTool类创建了LineShape类型的对象

    1.3.2 对象图

    1.3.3 交互图

    1.4 前置C++知识

    待续

    2. 观察者模式

    模式名和分类

    意图

    Observer 模式要解决的问题为:建立一个一(Subject, 主题)对多(Observer,观察者)的依赖关系,并且做到当主题变化的时候,依赖这个主题的多个观察者也能够同步改变。

    比如:
    对同一组数据进行统计分析时候,我们希望能够提供多种形式的表示(例如以表格进行统计显示、柱状图统计显示、百分比统计显示等)。指多个对象间存在一对多的依赖关系(数据为subject, 不同的表示方式为多个Observer),当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

    别名

    观察者模式又叫做发布-订阅(Publish-Subscribe)模式模型-视图(Model-View)模式源-监听器(Source-Listener)模式

    “一” 指代:publish,Model,Source,Subject. 上述含义等价。

    动机

    实用性

    结构

    在这里插入图片描述

    参与者

    1. Subject:抽象目标类
      – Subject知道它的观察者。可以有任意多个观察者观察同一个目标。
      – 提供注册和删除观察者对象的接口
    2. Observer:抽象观察者类
      – 为对象定义一个更新接口,这些对象在目标发生改变时需要获得通知。
    3. ConcreteSubject:具体目标
      – 将有关状态存入各自的ConcreteSubject对象
      – 当具体目标的状态发生改变时,向它的各个观察者发出通知
    4. ConcreteObserver:具体观察者
      – 维护一个指向具体目标 对象的引用
      – 存储有关状态,这些状态应与目标的状态保持一致
      – 实现Observer的更新接口,更新目标为:自身状态与目标状态保持一致。

    协作

    效果

    实现

    代码示例

    参考
    观察者模式的C++示例

    已知应用

    相关模式

  • 相关阅读:
    Spring Boot 整合SpringSecurity和JWT和Redis实现统一鉴权认证
    算法训练Day28 | LeetCode93.复原IP地址(回溯算法中的切割问题2);78 子集(每个节点都收集结果);90.子集II(子集问题+去重)
    跨浏览器测试需要进行的测试与评估
    Golang区块链钱包
    Web大学生网页作业成品——美食餐饮网站设计与实现(HTML+CSS+JavaScript)
    AJAX——跨域问题
    Graph Self-Supervised Learning: A Survey
    虎牙、斗鱼的变现困顿
    PyTorch学习笔记-Non-linear Activations与Linear Layers
    ios照片误删怎么恢复,iphone已经删除的照片怎么恢复
  • 原文地址:https://blog.csdn.net/u011852872/article/details/125871053