组件协作模式

news2024/11/25 12:56:31

二、组件协作模式

  • 组件协作模式概念
    • 1、模板方法模式(Template_Method)
      • 模式定义
      • 动机(Motivation)
      • 具体代码举例实现
      • 要点总结
    • 2、策略模式(Strategy)
    • 3、观察者模式(Observer/Event)

组件协作模式概念

  • 现代软件专业分工之后的第一个结果是“框袈与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。

1、模板方法模式(Template_Method)

模式定义

  • 定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Mthod 使得子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法某些特定步骤。

动机(Motivation)

  • 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。
  • 如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?
    先给出一个类的设计图
    在这里插入图片描述

具体代码举例实现

  1. 先给出未使用模板方法的设计,把主要的主流程设计丢给了主程序,交给后面的人设计
#include <iostream>

using namespace std;

class Library
{
public:
    void step1()
    {
        cout << "step1()" << endl;
    }

    void step3()
    {
        cout << "step3()" << endl;
    }

    void step5()
    {
        cout << "step5()" << endl;
    }
};

class Application
{
public:
    bool step2()
    {
        cout << "step2()" << endl;
        return true;
    }

    bool step4()
    {
        cout << "step4()" << endl;
        return true;
    }
};

int main()
{
    Library lib;
    Application app;
    lib.step1();

    if (app.step2())
    {
        lib.step3();
    }

    if (app.step4())
    {
        lib.step5();
    }

    return 0;
}
  1. 给出使用模板方法模式的设计,主流程框架稳定不动,由Libray类设计
#include <iostream>

using namespace std;

class Library
{
public:
    virtual ~Library() {};

public:
    // 主流程
    void run()
    {
        step1();

        if (step2())
        {
            step1();
        }
        if (step4())
        {
            step5();
        }
    }


    void step1()
    {
        cout << "step1()" << endl;
    }

    void step3()
    {
        cout << "step3()" << endl;
    }

    void step5()
    {
        cout << "step5()" << endl;
    }


protected:
    virtual bool step2() = 0;
    virtual bool step4() = 0;
};

class Application : public Library
{
public:
    bool step2()
    {
        cout << "step2()" << endl;
        return true;
    }

    bool step4()
    {
        cout << "step4()" << endl;
        return true;
    }
};

int main()
{
    Library* lib = new Application;
    lib->run();
    return 0;
}

要点总结

  • Template Method 模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。
  • 除了可以灵活应对子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构是Template Method的典型应用。
  • 在具体实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法、纯虚方法),但一般推荐将它们设置为protected方法。

2、策略模式(Strategy)

3、观察者模式(Observer/Event)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1093287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【微服务】微服务初步认识 - 微服务技术如何学习 · 认识微服务架构

微服务&#xff08;1&#xff09; 文章目录 【微服务】&#xff08;1&#xff09;1. 微服务相关技术栈2. 微服务学习路线3. 认识微服务架构3.1 单体架构3.2 分布式架构3.3 微服务(架构)3.4 微服务(架构)治理落实相关的SpringCloud、SpringCloudAlibaba和阿里巴巴的Dubbo提供的服…

【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口

文章目录 【MySQL SpringBoot 小点子】全面实现流程 数据库导出Excel表格文件的接口1. 什么是VO&#xff08;View Object&#xff09;对象2. BeanCopyUtils进行两个对象的数据转移3. mapper层实现4. service层实现5. vo对象创建6. 保存路径配置7. controller层核心代码实现8.…

048:mapboxGL本地上传geojson文件,在map上解析显示图形

第048个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中本地上传geojson文件,通过mapbox加载geojson数据的方法解析,在地图上显示图形。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共112行)相关API…

39 本书助力精益成长

目录 ​编辑 Idea - 思考者的世界处处都是台风口 人才 - 所有的问题,归根结底都是人的问题 产品 - 不仅要满足需求,还要满足想象力

云上攻防-云原生篇KubernetesK8s安全APIKubelet未授权访问容器执行

文章目录 K8S集群架构解释&#xff08;见上图参考&#xff09;K8S集群攻击点(见上图参考)-重点API Server未授权访问&kubelet未授权访问复现 K8S集群架构解释&#xff08;见上图参考&#xff09; Kubernetes是一个开源的&#xff0c;用于编排云平台中多个主机上的容器化的…

[动手学深度学习]生成对抗网络GAN学习笔记

论文原文&#xff1a;Generative Adversarial Nets (neurips.cc) 李沐GAN论文逐段精读&#xff1a;GAN论文逐段精读【论文精读】_哔哩哔哩_bilibili 论文代码&#xff1a;http://www.github.com/goodfeli/adversarial Ian, J. et al. (2014) Generative adversarial network…

【Kotlin精简】第3章 类与接口

1 简介 Kotlin类的声明和Java没有什么区别&#xff0c;Kotlin中&#xff0c;类的声明也使用class关键字&#xff0c;如果只是声明一个空类&#xff0c;Kotlin和Java没有任何区别&#xff0c;不过定义类的其他成员会有一些区别。实例化类不用写new&#xff0c;类被继承或者重写…

如何开始使用 Kubernetes RBAC

基于角色的访问控制 (RBAC) 是一种用于定义用户帐户可以在 Kubernetes 集群中执行的操作的机制。启用 RBAC 可以降低与凭证盗窃和帐户接管相关的风险。向每个用户授予他们所需的最低权限集可以防止帐户拥有过多的特权。 大多数流行的 Kubernetes 发行版都从单个用户帐户开始,…

值得拥有的 12 大最佳照片恢复软件 [持续更新]

由于误删、损坏、病毒攻击等原因&#xff0c;您可能会丢失珍贵的照片。幸运的是&#xff0c;市场上有专业的照片恢复工具。但是&#xff0c;根据您的需要找到合适的照片恢复软件的任务可能压力很大。为了帮助您做出正确的决定&#xff0c;我们精心挑选了您可以信赖的收费最高的…

opencv 图像识别 指纹识别 - python 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器视觉的指纹识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&#xff0c;适…

STM32Cube高效开发教程<基础篇>(四)----GPIO输入/输出

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。    本专栏博客参考《STM32Cube高效开发教程(基础篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。 一、 GPIO功能…

Vue3 + Nodejs 实战 ,文件上传项目--实现文件批量上传(显示实时上传进度)

目录 技术栈 1.后端接口实现 2.前端实现 2.1 实现静态结构 2.2 整合上传文件的数据 2.3 实现一键上传文件 2.4 取消上传 博客主页&#xff1a;専心_前端,javascript,mysql-CSDN博客 系列专栏&#xff1a;vue3nodejs 实战--文件上传 前端代码仓库&#xff1a;jiangjunjie…

城市消防无人机控制系统的设计

目录 摘 要......................................................................................................................... 2 第一章 绪论.............................................................................................................…

Qt 5.12.12 静态编译(MinGW)

前置准备 系统环境 版本 Windows 11 专业版 版本 22H2 安装日期 ‎2023/‎6/‎18 操作系统版本 22621.2428 体验 Windows Feature Experience Pack 1000.22674.1000.0依赖工具 gcc Qt 5.12.12 安装 MinGW 后自动安装 https://download.qt.io/archive/qt/5.12/5.12.12/qt-ope…

【C/C++数据结构 - 2】:稳定性与优化揭秘,揭开插入排序、希尔排序和快速排序的神秘面纱!

文章目录 排序的稳定性插入排序插入排序的优化 希尔排序快速排序 排序的稳定性 稳定排序&#xff1a;排序前2个相等的数在序列中的前后位置顺序和排序后它们2个的前后位置顺序相同。&#xff08;比如&#xff1a;冒泡、插入、基数、归并&#xff09; 非稳定排序&#xff1a;排…

【Linux】自旋锁 以及 读者写者问题

自旋锁 以及 读者写者问题 一、自旋锁1、其他常见的各种锁2、自旋锁相关的API函数 二、读者写者问题1、读者与写者的关系2、读写锁的API函数3、用伪代码理解读写锁的原理4、读写锁的演示使用 一、自旋锁 1、其他常见的各种锁 悲观锁&#xff1a;在每次取数据时&#xff0c;总是…

Docker 构建Python镜像时,pip使用国内地址的dockerfile模版

一、问题现象 构建镜像时&#xff0c;使用pip命令打包报错&#xff1a; 二、问题根因 因国内无法访问pip的配置文件中的仓库地址 三、解决办法 这个办法同样适用于&#xff1a;物理机&#xff0c;这个地址是阿里云的 pip config set global.index-url http://mirrors.aliy…

<C++> IO流

C语言的输入与输出 在C语言当中&#xff0c;我们使用最频繁的输入输出方式就是scanf与printf&#xff1a; scanf&#xff1a; 从标准输入设备&#xff08;键盘&#xff09;读取数据&#xff0c;并将读取到的值存放到某一指定变量当中。printf&#xff1a; 将指定的数据输出到…

idea自动封装方法

例如 package com.utils;import java.lang.reflect.Field; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle;/*** author hrui* date 2023/10/13 13:49*/ public class DBUtils {private static ResourceBundle bund…

【网络编程】Linux网络编程基础与实战第二弹——Socket编程

Socket编程套接字概念套接字通讯原理 网络编程接口网络字节序sockaddr数据结构socket函数bind函数listen函数accept函数connect函数 ) Socket编程 套接字概念 Socket本身有“插座”的意思&#xff0c;在Linux环境下&#xff0c;用于表示进程间网络通信的特殊文件类型。本质为…