組件協作模式

目錄

  • “組件協作”模式
    • 模板方法模式
      • 動機
      • 模式定義
      • 結構
      • 要點總結

“組件協作”模式

  • 現代軟件專業分工之后的第一個結果是“框架與應用程序的劃分”。“組件協作”模式通過晚期綁定,實現框架與應用程序之間的松耦合,是二者之間協作時常用的模式。
  • 典型模式,以下模式在“組件協作”這一層面體現更明顯
    • 模板方法模式 Template Method
    • 觀察者模式 Observer / Event
    • 策略模式 Strategy

模板方法模式

動機

  • 在軟件構建過程中,對于某一項任務,它常常有穩定的整體操作結構,但各個子步驟卻有很多改變的需求,或者由于固有的原因(比如框架與應用之間的關系)子步驟無法和任務的整體結構同時實現。
  • 如何在確定穩定操作結構的前提下,來靈活應對各個子步驟的變化或者晚期實現需求?
  1. 結構化軟件設計思維流程
    在這里插入圖片描述
// templateLib.cpp	程序庫開發人員
class Library
{
public:void Step1(){...}void Step3(){...}void Step5(){...}
};// templateApplication.cpp	應用程序開發人員
class Application
{
public:bool Step2(){...}void Step4(){...}
};// main.cpp	應用程序開發人員
int main()
{Library lib();Application app();// 應用程序開發人員編寫主流程lib.Step1()if(app.Step2()){lib.Step3()}for (int i = 0; i < 3; i++){app.Step4();}lib.Step(5);
}
  1. 面向對象軟件設計思維流程 在這里插入圖片描述
// templateLib.cpp	程序庫開發人員
class Library
{
public:// 穩定 template method,穩定中支持變化void Run(){// 程序庫開發人員編寫主流程Step1();if(Step2())		// 支持變化,虛函數的多態調用{Step3();}for (int i = 0; i < 4; i++){Step4();	// 支持變化,虛函數的多態調用}Step5();}virtual ~Library(){ }		// 基類析構函數寫為虛函數protected:void Step1()		// 穩定{...}void Step3()		// 穩定{...}void Step5()		// 穩定{...}virtual bool Step2() = 0;	// 變化virtual void Step4() = 0;	// 變化
};// templateApplication.cpp	應用程序開發人員
class Application : public Library
{
protected:bool Step2 override(){//子類重寫實現}void Step4 override(){// 子類重寫實現}virtual ~Application override();
};// main.cpp	應用程序開發人員
int main()
{Library* pLib = new Application();	// 多態指針,基類類型指針指向派生類對象lib->Run();delete pLib;
}

如果 基類的析構函數不是虛函數,當通過 基類指針 刪除 派生類對象 時,只會調用基類的析構函數,而不會調用派生類的析構函數,可能導致 內存泄漏 或 資源未釋放。

  1. 早綁定與晚綁定
    在這里插入圖片描述
    第一種方式早綁定(晚實現部分調用早實現部分)到第二種方式晚綁定(早實現部分調用晚實現部分)。

模式定義

定義一個操作中的算法的骨架(穩定,如前文中的run()),將一些步驟延遲到子類中(支持子類實現變化)。模板方法模式使得子類可以不改變(即復用)一個算法的結構即可重定義(override重寫)該算法的某些特定步驟。

穩定中有變化,穩定的部分寫為非虛函數,變化的部分寫為虛函數。
設計模式最大的作用是在穩定變化之間,尋找隔離點,從而分離它們,管理變化。

結構

在這里插入圖片描述
紅色部分為穩定部分,藍色部分為變化部分。

要點總結

  • Template Method模式是一種非常基礎性的設計模式,在面向對象系統中有著大量的應用。它用最簡潔的機制(虛函數的多態性)為很多應用程序框架提供了靈活的擴展點,是代碼復用方面的基本實現結構。
  • 除了可以靈活應對子步驟的變化外,“不要調用我,讓我來調用你”的反向控制結構是 模板方法模式 的典型應用。
  • 在具體實現方面,被Template Method調用的虛方法可以具有實現,也可以沒有任何實現(抽象方法、純虛方法),但一般推薦將它們設置為protected方法。

來源:極客班——C++設計模式入門

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86562.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86562.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86562.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker 運行RAGFlow 搭建RAG知識庫

借鑒視頻&#xff1a;DeepSeek 10分鐘完全本地部署 保姆級教程 斷網運行 無懼隱私威脅 大語言模型 CPU GPU 混合推理32B輕松本地部署&#xff01;DeepSeek模擬王者&#xff01;&#xff01;_嗶哩嗶哩_bilibili 借鑒博客&#xff1a;RAGFlow搭建全攻略&#xff1a;從入門到精通…

python編寫腳本每月1號和15號執行一次將TRX是否強更發送到釘釘

編寫腳本 import requests import json import time import hmac import hashlib import base64 import urllib.parse# 1. 配置釘釘機器人 webhook "https://oapi.dingtalk.com/robot/send?access_tokenXXXXXX" secret "XXXXXXXX" # 如果沒有加簽驗…

Linux-系統管理

[rootlocalhost ~]# lscpu //查看cpu [rootlocalhost etc]# cat /etc/redhat-release //查看當前目錄的版本信息 [rootlocalhost ~]# ifconfig //查看當前激活的網卡信息 [rootlocalhost ~]# ifconfig ens33 192.168.1.10 //給網卡配置臨時地址 [rootlocalhost ~]# hostnam…

【Spring】系統化的 Spring Boot 全棧學習教程,涵蓋基礎配置、核心功能、進階實戰及文檔自動生成

這里寫目錄標題 &#x1f6e0;? **一、環境搭建與項目創建**1. 開發環境準備2. 創建第一個項目&#xff08;Spring Initializr&#xff09; &#x1f680; **二、核心功能開發**1. RESTful API 開發2. 數據持久化&#xff08;Spring Data JPA&#xff09;3. 配置文件多環境切換…

Discrete Audio Tokens: More Than a Survey

文章目錄 模型設計的考慮量化的方式&#xff1a;比特率&#xff1a;Fixed vs. Adaptive Bitrate碼本內容設計的考慮Streamability. 模型評估Reconstruction Evaluation and Complexity Analysis.識別和生成任務&#xff08;SE, SR)Acoustic Language Modeling.Music Generation…

設計在線教育項目核心數據庫表

1 在線教育項目核心數據庫表設計-ER圖 簡介&#xff1a;設計在線教育的核心庫表結構 在線教育站點速覽 xdclass.net ER圖知識回顧&#xff1a; 實體對象&#xff1a;矩形屬性&#xff1a;橢圓關系&#xff1a;菱形 核心庫表 videochapterepisodeuservideo_ordervideo_banner…

【音視頻】Ubuntu下配置ffmpeg庫

一、下載預編譯的庫 在github上可以找到編譯好的ffmpeg&#xff0c;多個版本的都有&#xff0c;這里我下載ffmpeg編譯好的動態庫 倉庫鏈接&#xff1a;(https://github.com/BtbN/FFmpeg-Builds/releases 下載后解壓得到 二、配置環境變量 打開.bashrc配置文件&#xff0c;添…

equine在神經網絡中建立量化不確定性

?一、軟件介紹 文末提供程序和源碼下載 眾所周知&#xff0c;用于監督標記問題的深度神經網絡 &#xff08;DNN&#xff09; 可以在各種學習任務中產生準確的結果。但是&#xff0c;當準確性是唯一目標時&#xff0c;DNN 經常會做出過于自信的預測&#xff0c;并且無論測試數…

C++動態鏈接庫之非托管封裝Invoke,供C#/C++ 等編程語言使用,小白教程——C++動態鏈接庫(一)

目錄&#xff1a; 一、前言及背景1.1需求描述1.2應用背景 二、編程基礎知識2.1非托管方式交互邏輯2.2該方式下C 與C# 數據轉換對應2.3VS工程下的注意點2.4C封裝接口2.4.1 __declspec(dllexport) 方式2.4.2 .def 文件方式2.4.3結合使用&#xff08;高級&#xff09; 2.5C# 封裝接…

消息隊列的網絡模型詳解:IO多路復用、Reactor模型、零拷貝

文章目錄 一、消息隊列的網路模型擬解決問題單個請求性能優化1. 編解碼速度2. 網絡模塊處理速度 并發請求性能優化1. 高效的連接管理2. 快速處理高并發請求3. 大流量場景處理 二、一些技術基礎知識1. 基于多路復用技術管理 TCP 連接&#xff08;提高性能&#xff09;&#xff0…

【生成模型】【模型介紹】(一)視頻生成Wan2.1速度質量簡單評測

基礎模型&#xff1a;FramePack https://github.com/kijai/ComfyUI-FramePackWrapper huggingface-cli download Comfy-Org/HunyuanVideo_repackaged --local-dir Comfy-Org/HunyuanVideo_repackaged --resume-download huggingface-cli download Comfy-Org/sigclip_vision_3…

微信小程序之滑塊scroll-view

我們要做的東西&#xff1a; 滑塊的視頻 我們先做個基本的圖片和文字(wxm;)&#xff1a; <scroll-view><view class"scrollItem"><image src"https://bkimg.cdn.bcebos.com/pic/fc1f4134970a304e251fd88e8191b086c9177f3ef634?x-bce-processim…

如何寫出優秀的單元測試?

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 寫出優秀的單元測試需要考慮以下幾個方面&#xff1a; 1. 測試用例設計 測試用例應該覆蓋被測試代碼的不同場景和邊界情況&#xff0c;以盡可能發現潛在的問題。…

Python LangChain 3.0 詳解:重構大模型應用開發范式

引言 在人工智能技術日新月異的今天&#xff0c;大模型應用開發框架的迭代速度直接決定了AI落地的效率。LangChain作為這一領域的領軍者&#xff0c;于2024年正式發布3.0版本&#xff0c;通過架構重構與功能擴展&#xff0c;為開發者提供了更強大的工具集。本文將深入解析Lang…

Java模板設計模式詳解

以下是Java模板設計模式的詳細解析&#xff1a; 一、核心定義 模板模式&#xff08;Template Method Pattern&#xff09;是一種?行為型設計模式?&#xff0c;通過定義算法骨架并允許子類重寫特定步驟&#xff0c;實現代碼復用與擴展。其核心在于控制?流程標準化?&#x…

Word 中批量轉換 LaTeX 公式為標準數學格式的終極方法(附宏設置教程)

在學術寫作中&#xff0c;我們常常需要將 LaTeX 格式的公式插入到 Word 文檔中。但如果你有一大段公式使用 $...$ 或 LaTeX 命令&#xff0c;手動轉換無疑非常耗時。本文將介紹一種“一鍵轉換所有 LaTeX 公式為 Word 數學公式”的方法&#xff0c;只需設置一次宏&#xff0c;后…

linux上查看文件系統類型

假設 有文件系統mount在/data-pool&#xff1a; df -h ./ 文件系統 大小 已用 可用 已用% 掛載點 data-pool 1.5T 345M 1.5T 1% /data-pool如何查看 data-pool 這個文件系統的文件系統類型&#xff08;格式&#xff09;&#xff0c;比如是 ext4、btrfs、z…

Android14-HAL分析

文章目錄 一、HAL綜述二、Android各版本HAL的演進三、傳統HAL(< Android7)四、HIDL HAL(Android8-10)1、參考資料2、概述2、架構3、實現一個HIDL HAL1&#xff09;HIDL的開發流程2&#xff09;HIDL HAL的語法3&#xff09;創建HAL接口&生成impl庫4&#xff09;Service實…

【WebSocket】學習總結

是一種協議&#xff1b; 作用與Web應用程序和服務端之間&#xff1b; 實時的、雙向的&#xff1b; 通過單一的TCP提供了持久化連接&#xff1b; 優勢&#xff1a; 實時、雙向、可以減少網絡的負載&#xff1b; 劣勢&#xff1a; 需要客戶端和服務端雙方都支持&#xff1b; 連續…

“組件協作”模式之策略模式

目錄 策略模式引例動機 Motivation模式定義結構要點總結 策略模式 引例 稅務計算系統&#xff0c;根據各個國家的稅法&#xff0c;進行稅務計算。各個國家稅法規定差別很大&#xff0c;需對應進行相應的實現。 常規解耦前寫法 使用if-else語句或switch-case語句進行結構化分…