建造者模式及優化

建造者模式是一種創建型設計模式,它將復雜對象的構建過程與表示分離,使得同樣的構建過程可以創建不同的表示。核心思想是指揮者定流程,建造者填細節,通過多個步驟逐步構建對象,并允許靈活組合這些步驟以生成不同配置的對象。通過將復雜對象的構建步驟抽象化,實現了"流程固定、配置可變"的靈活創建方式。

介紹

核心角色

  1. 產品(Product):被構建的復雜對象(如電腦、汽車)。
  2. 抽象建造者(Abstract Builder):定義構建產品的抽象方法(步驟)和返回產品的接口。
  3. 具體建造者(Concrete Builder):實現抽象建造者的方法,完成具體的構建步驟,并提供獲取產品的方式。
  4. 指揮者(Director):控制構建流程(調用建造者的步驟),隔離客戶端與構建過程。

優點

  1. 分離構建與表示:構建流程(指揮者)與具體部件配置(建造者)分離,便于擴展新產品。
  2. 靈活定制:通過更換具體建造者,可在不改變流程的情況下生成不同配置的對象。
  3. 精確控制構建過程:分步構建允許在每個步驟中加入校驗或邏輯,確保對象正確構建。
  4. 代碼復用:公共構建流程在指揮者中實現,避免重復編碼。

適用場景

  1. 構建復雜對象
    當對象包含多個部件(如電腦、汽車、文檔),且構建步驟固定但部件配置可變時(如不同配置的電腦)。
  2. 需要多種表示形式
    同一構建流程需生成不同產品(如同一文檔模板生成PDF、Word、HTML版本)。
  3. 構建過程需精細控制
    需分步構建對象,或需要在構建過程中調整步驟(如先裝CPU再裝內存,順序不可亂)。

實現

以組裝電腦為例,電腦包含CPU、內存、顯卡等部件,用戶可定制不同配置(如辦公電腦、游戲電腦),適合用建造者模式分離"組裝流程"和"具體配置"。

#include <string>
#include <iostream>
#include <vector>// 產品:電腦
class Computer {
private:std::string cpu;    // 處理器std::string memory; // 內存std::string graphics; // 顯卡std::string storage; // 存儲
public:void setCPU(const std::string& c) { cpu = c; }void setMemory(const std::string& m) { memory = m; }void setGraphics(const std::string& g) { graphics = g; }void setStorage(const std::string& s) { storage = s; }// 展示電腦配置void showInfo() const {std::cout << "CPU: " << cpu << "\n"<< "內存: " << memory << "\n"<< "顯卡: " << graphics << "\n"<< "存儲: " << storage << std::endl;}
};// 抽象建造者:定義電腦組裝步驟
class ComputerBuilder {
public:virtual ~ComputerBuilder() = default;virtual void buildCPU() = 0;    // 構建CPUvirtual void buildMemory() = 0; // 構建內存virtual void buildGraphics() = 0; // 構建顯卡virtual void buildStorage() = 0; // 構建存儲virtual Computer* getResult() = 0; // 返回組裝好的電腦
};// 具體建造者1:辦公電腦
class OfficeComputerBuilder : public ComputerBuilder {
private:Computer* computer; // 正在構建的電腦
public:OfficeComputerBuilder() { computer = new Computer(); }~OfficeComputerBuilder() override { delete computer; }void buildCPU() override {computer->setCPU("Intel i5"); // 辦公級CPU}void buildMemory() override {computer->setMemory("16GB DDR4"); // 中等內存}void buildGraphics() override {computer->setGraphics("集成顯卡"); // 無需獨立顯卡}void buildStorage() override {computer->setStorage("512GB SSD"); // 夠用的存儲}Computer* getResult() override {return computer; // 返回構建好的電腦(轉移所有權)}
};// 具體建造者2:游戲電腦
class GameComputerBuilder : public ComputerBuilder {
private:Computer* computer;
public:GameComputerBuilder() { computer = new Computer(); }~GameComputerBuilder() override { delete computer; }void buildCPU() override {computer->setCPU("Intel i9"); // 高性能CPU}void buildMemory() override {computer->setMemory("32GB DDR5"); // 大容量高速內存}void buildGraphics() override {computer->setGraphics("NVIDIA RTX 4090"); // 頂級顯卡}void buildStorage() override {computer->setStorage("2TB SSD"); // 大容量存儲}Computer* getResult() override {return computer;}
};// 指揮者:控制構建流程
class Director {
private:ComputerBuilder* builder; // 指向當前建造者
public:explicit Director(ComputerBuilder* b) : builder(b) {}// 切換建造者void setBuilder(ComputerBuilder* b) {builder = b;}// 執行構建流程(固定步驟)Computer* construct() {builder->buildCPU();builder->buildMemory();builder->buildGraphics();builder->buildStorage();return builder->getResult(); // 返回最終產品}
};int main() {// 1. 創建具體建造者(辦公電腦)ComputerBuilder* officeBuilder = new OfficeComputerBuilder();Director director(officeBuilder);  // 指揮者控制構建流程Computer* officePC = director.construct();  // 執行構建std::cout << "=== 辦公電腦配置 ===" << std::endl;officePC->showInfo();// 2. 創建具體建造者(游戲電腦)ComputerBuilder* gameBuilder = new GameComputerBuilder();director.setBuilder(gameBuilder);  // 切換建造者Computer* gamePC = director.construct();std::cout << "\n=== 游戲電腦配置 ===" << std::endl;gamePC->showInfo();// 清理資源delete officePC;delete gamePC;delete officeBuilder;delete gameBuilder;return 0;
}

輸出結果

=== 辦公電腦配置 ===
CPU: Intel i5
內存: 16GB DDR4
顯卡: 集成顯卡
存儲: 512GB SSD=== 游戲電腦配置 ===
CPU: Intel i9
內存: 32GB DDR5
顯卡: NVIDIA RTX 4090
存儲: 2TB SSD

應用場景

  1. 產品配置
    • 電子產品組裝(如電腦、手機的不同型號配置)。
    • 汽車制造(同一車型的標準版、豪華版、運動版)。
  2. 文檔生成
    • 報告生成工具(同一內容生成PDF、Markdown、HTML格式)。
    • 代碼生成器(根據模板生成不同語言的代碼)。
  3. 復雜對象創建
    • 游戲角色創建(同一角色模型,不同裝備、技能配置)。
    • 數據庫連接池(不同參數配置的連接對象)。
  4. 框架與庫
    • C++ STL中的stringstream(分步構建字符串)。
    • 建造者模式在JSON/XML解析器中用于構建樹形結構。

優化

優化方向

  1. 支持動態自定義配置:允許客戶端靈活設置每個部件(而非局限于預設的“辦公/游戲”配置)。
  2. 引入可選部件與校驗:支持非必需部件(如散熱器、聲卡),并添加部件兼容性校驗。
  3. 使用智能指針管理資源:避免手動內存管理,防止內存泄漏。
  4. 流暢接口(Fluent Interface):通過鏈式調用簡化建造過程,提升代碼可讀性。
  5. 指揮者功能增強:支持自定義構建流程(如可選步驟、步驟順序調整)。
#include <string>
#include <iostream>
#include <vector>
#include <memory> // 智能指針
#include <stdexcept> // 異常處理// 產品:電腦(支持更多部件和兼容性校驗)
class Computer {
private:std::string cpu;std::string memory;std::string graphics; // 可選:集成/獨立顯卡std::string storage;std::string cooler;   // 可選:散熱器std::vector<std::string> compatibleCPUs = {"Intel i5", "Intel i9", "AMD Ryzen 5"};std::vector<std::string> compatibleMemories = {"16GB DDR4", "32GB DDR5", "64GB DDR5"};public:// 鏈式設置方法(Fluent Interface)Computer& setCPU(const std::string& c) { // 校驗CPU兼容性if (std::find(compatibleCPUs.begin(), compatibleCPUs.end(), c) == compatibleCPUs.end()) {throw std::invalid_argument("不支持的CPU型號:" + c);}cpu = c; return *this; }Computer& setMemory(const std::string& m) { if (std::find(compatibleMemories.begin(), compatibleMemories.end(), m) == compatibleMemories.end()) {throw std::invalid_argument("不支持的內存型號:" + m);}memory = m; return *this; }Computer& setGraphics(const std::string& g) { graphics = g; return *this; }Computer& setStorage(const std::string& s) { storage = s; return *this; }Computer& setCooler(const std::string& c) { cooler = c; return *this; }// 展示配置(包含可選部件)void showInfo() const {std::cout << "CPU: " << cpu << "\n"<< "內存: " << memory << "\n"<< "顯卡: " << (graphics.empty() ? "無(集成)" : graphics) << "\n"<< "存儲: " << storage << "\n"<< "散熱器: " << (cooler.empty() ? "無(默認)" : cooler) << std::endl;}// 校驗必填部件是否齊全bool isValid() const {return !cpu.empty() && !memory.empty() && !storage.empty();}
};// 抽象建造者(支持鏈式調用和智能指針)
class ComputerBuilder {
public:using Ptr = std::unique_ptr<ComputerBuilder>; // 智能指針管理virtual ~ComputerBuilder() = default;// 純虛方法:構建步驟(支持鏈式返回)virtual ComputerBuilder& buildCPU() = 0;virtual ComputerBuilder& buildMemory() = 0;virtual ComputerBuilder& buildGraphics() { return *this; } // 可選步驟(默認空實現)virtual ComputerBuilder& buildStorage() = 0;virtual ComputerBuilder& buildCooler() { return *this; }   // 可選步驟// 返回產品(智能指針,自動釋放)virtual std::unique_ptr<Computer> getResult() {if (!computer->isValid()) {throw std::logic_error("電腦配置不完整,缺少必填部件");}return std::move(computer); // 轉移所有權}protected:std::unique_ptr<Computer> computer = std::make_unique<Computer>(); // 產品
};// 具體建造者1:辦公電腦(基礎配置,可選散熱器)
class OfficeComputerBuilder : public ComputerBuilder {
public:ComputerBuilder& buildCPU() override {computer->setCPU("Intel i5");return *this;}ComputerBuilder& buildMemory() override {computer->setMemory("16GB DDR4");return *this;}// 辦公電腦默認無獨立顯卡(使用集成),無需重寫buildGraphicsComputerBuilder& buildStorage() override {computer->setStorage("512GB SSD");return *this;}// 可選:為辦公電腦添加低端散熱器ComputerBuilder& buildCooler() override {computer->setCooler("基礎風冷散熱器");return *this;}
};// 具體建造者2:游戲電腦(高性能配置,強制獨立顯卡和散熱器)
class GameComputerBuilder : public ComputerBuilder {
public:ComputerBuilder& buildCPU() override {computer->setCPU("Intel i9");return *this;}ComputerBuilder& buildMemory() override {computer->setMemory("32GB DDR5");return *this;}// 游戲電腦必須有獨立顯卡(重寫為強制步驟)ComputerBuilder& buildGraphics() override {computer->setGraphics("NVIDIA RTX 4090");return *this;}ComputerBuilder& buildStorage() override {computer->setStorage("2TB SSD");return *this;}// 游戲電腦必須有高性能散熱器ComputerBuilder& buildCooler() override {computer->setCooler("水冷散熱器");return *this;}
};// 具體建造者3:自定義建造者(允許客戶端自由配置)
class CustomComputerBuilder : public ComputerBuilder {
public:// 空實現,由客戶端手動調用產品的set方法配置ComputerBuilder& buildCPU() override { return *this; }ComputerBuilder& buildMemory() override { return *this; }ComputerBuilder& buildStorage() override { return *this; }// 提供直接訪問產品的接口(用于自定義配置)Computer* getComputer() { return computer.get(); }
};// 指揮者(支持靈活流程和可選步驟)
class Director {
public:// 構建基礎電腦(必填部件:CPU、內存、存儲)std::unique_ptr<Computer> buildBasic(ComputerBuilder::Ptr builder) {builder->buildCPU()->buildMemory()->buildStorage();return builder->getResult();}// 構建完整電腦(包含可選部件)std::unique_ptr<Computer> buildFull(ComputerBuilder::Ptr builder) {builder->buildCPU()->buildMemory()->buildGraphics()->buildStorage()->buildCooler();return builder->getResult();}// 自定義流程(按傳入的步驟函數執行)using StepFunc = std::function<void(ComputerBuilder*)>;std::unique_ptr<Computer> buildCustom(ComputerBuilder::Ptr builder, const std::vector<StepFunc>& steps) {for (const auto& step : steps) {step(builder.get());}return builder->getResult();}
};int main() {try {Director director;// 1. 構建辦公電腦(基礎配置)std::cout << "=== 辦公電腦(基礎配置) ===" << std::endl;auto officeBasic = director.buildBasic(std::make_unique<OfficeComputerBuilder>());officeBasic->showInfo();// 2. 構建游戲電腦(完整配置)std::cout << "\n=== 游戲電腦(完整配置) ===" << std::endl;auto gameFull = director.buildFull(std::make_unique<GameComputerBuilder>());gameFull->showInfo();// 3. 自定義電腦(自由配置部件)std::cout << "\n=== 自定義電腦 ===" << std::endl;auto customBuilder = std::make_unique<CustomComputerBuilder>();// 直接配置產品的具體部件(鏈式調用)customBuilder->getComputer()->setCPU("AMD Ryzen 5")->setMemory("64GB DDR5")->setGraphics("AMD Radeon RX 7900")->setStorage("4TB SSD")->setCooler("高端風冷散熱器");// 用指揮者構建(此處僅做校驗)auto customPC = director.buildBasic(std::move(customBuilder));customPC->showInfo();// 4. 自定義構建流程(動態指定步驟)std::cout << "\n=== 動態流程構建(僅CPU+內存+存儲) ===" << std::endl;auto dynamicBuilder = std::make_unique<CustomComputerBuilder>();dynamicBuilder->getComputer()->setCPU("Intel i5")->setMemory("32GB DDR4")->setStorage("1TB SSD");// 定義自定義步驟(僅執行CPU和內存校驗)std::vector<Director::StepFunc> steps = {[](ComputerBuilder* b) { b->buildCPU(); },  // 實際是校驗CPU已設置[](ComputerBuilder* b) { b->buildMemory(); } // 校驗內存已設置};auto dynamicPC = director.buildCustom(std::move(dynamicBuilder), steps);dynamicPC->showInfo();} catch (const std::exception& e) {std::cerr << "錯誤:" << e.what() << std::endl;return 1;}return 0;
}

輸出結果

=== 辦公電腦(基礎配置) ===
CPU: Intel i5
內存: 16GB DDR4
顯卡: 無(集成)
存儲: 512GB SSD
散熱器: 無(默認)=== 游戲電腦(完整配置) ===
CPU: Intel i9
內存: 32GB DDR5
顯卡: NVIDIA RTX 4090
存儲: 2TB SSD
散熱器: 水冷散熱器=== 自定義電腦 ===
CPU: AMD Ryzen 5
內存: 64GB DDR5
顯卡: AMD Radeon RX 7900
存儲: 4TB SSD
散熱器: 高端風冷散熱器=== 動態流程構建(僅CPU+內存+存儲) ===
CPU: Intel i5
內存: 32GB DDR4
顯卡: 無(集成)
存儲: 1TB SSD
散熱器: 無(默認)

優化點說明

  1. 動態自定義配置
    • 新增CustomComputerBuilder,允許客戶端通過getComputer()直接訪問產品,自由設置部件(如setCPU("AMD Ryzen 5")),突破預設配置的限制。
    • 配合鏈式調用(obj->setA()->setB()),使配置代碼更簡潔直觀。
  2. 可選部件與校驗機制
    • 將顯卡、散熱器設為可選部件,抽象建造者中提供默認空實現,具體建造者按需重寫(如游戲電腦必須實現buildGraphics)。
    • 產品內部添加兼容性校驗(如compatibleCPUs)和完整性校驗(isValid()),避免無效配置(如使用不支持的CPU型號)。
  3. 智能指針與資源安全
    • 使用std::unique_ptr管理建造者和產品的生命周期,無需手動delete,徹底避免內存泄漏。
    • 產品所有權通過std::move轉移,明確資源歸屬。
  4. 指揮者功能增強
    • 提供多種預設流程(buildBasic基礎配置、buildFull完整配置),滿足不同場景需求。
    • 支持自定義流程(buildCustom),通過函數對象動態指定步驟,靈活度極高(如僅構建CPU+內存+存儲)。
  5. 擴展性提升
    • 新增部件(如未來添加“聲卡”)時,只需在Computer中添加setSoundCard方法,抽象建造者中添加默認空實現,無需修改現有建造者和指揮者,符合開閉原則。

優點

  1. 更高的靈活性:支持預設配置、完全自定義配置、動態流程配置,適應多樣化需求。
  2. 更強的安全性:智能指針自動管理內存,校驗機制避免無效配置,異常處理明確錯誤原因。
  3. 更好的擴展性:新增部件或流程時,對現有代碼侵入性極小,易于維護。
  4. 更優的易用性:鏈式調用和多樣化構建接口降低使用門檻,客戶端可按需選擇復雜度。

適用場景

  • 復雜產品定制平臺:如電商網站的“自定義PC”功能,用戶可自由選擇每個部件,系統自動校驗兼容性。
  • 動態報表生成:允許用戶選擇報表包含的模塊(表格、圖表、摘要),按自定義順序組裝。
  • 游戲角色創建器:玩家可選擇角色的種族、職業、技能、裝備,系統確保選擇組合有效(如某些技能僅特定種族可用)。

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

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

相關文章

【09】C++實戰篇——C++ 生成靜態庫.lib 及 C++調用lib,及實際項目中的使用技巧

文章目錄1 C 靜態庫.lib 生成1.1 靜態庫lib的生成方法和使用方法1.2 創建靜態庫項目1.3 編寫.h 和 .cpp文件1.4 設置 及 生成 DLL2 調用 C 靜態庫lib2.1 新建LIBtest及測試代碼2.2 靜態庫配置 及代碼調用測試3 實際項目中的使用技巧、及通用設置3.1 設置lib輸出路徑3.2 設置頭文…

飛算JavaAI:從寫不出代碼到絲滑開發,飛算JavaAI把小白從編程深淵撈進了正軌---它都讓我懷疑自己是不是多余的!

開篇介紹 對于很多初學者來說&#xff0c;編程是一項既有趣又充滿挑戰的任務。面對復雜的代碼和繁瑣的開發流程&#xff0c;常常會感到無從下手。不過&#xff0c;現在有了飛算JavaAI&#xff0c;這一切都將變得簡單起來。 它有啥實用功能呢&#xff1f; 比如&#xff1a; …

關于tresos Studio(EB)的MCAL配置之GtmCfg

Generic Time Module通用時鐘模塊GeneralGtmCfg_DevErrorDetect開發者錯誤檢測開關GtmCfg_DemErrorReporting診斷錯誤報告開關GtmCfg_VersionInfoApi獲取版本信息的接口開關GtmCfg_ConfigSetClockManagementUnitGlobal_Clock_Control_Numerator全局時鐘分頻器的分子Global_Cloc…

深入探索Weaviate:構建高效AI應用的數據庫解決方案

在當今數據驅動的世界中&#xff0c;高效地存儲、檢索和處理大規模數據成為了AI應用開發的關鍵挑戰。Weaviate作為一個開源的向量搜索引擎&#xff0c;憑借其強大的功能和靈活的架構&#xff0c;正逐漸成為開發者構建智能AI應用的首選工具。本文將深入探討Weaviate的核心概念、…

【開源】一款開源、跨平臺的.NET WPF 通用權限開發框架 (ABP) ,功能全面、界面美觀

文章目錄一、開源地址二、框架介紹三、技術路線四、適用場景五、功能模塊六、框架演示截圖一、開源地址 Gihub地址&#xff1a; https://github.com/HenJigg/wpf-abp B站學習視頻&#xff1a;https://www.bilibili.com/video/BV1nY411a7T8?spm_id_from333.788.player.switch&…

信創緩存中間件-TongRDS(Redis平替)安裝

TongRDS 是由東方通開發的國產 分布式內存數據緩存中間件&#xff0c;功能類似于 Redis&#xff0c;但它是完全自主研發的國產產品&#xff0c;是國內信創的一大重要組件。它兼容 Redis 的接口&#xff0c;能做到應用代碼無需改動即可替換使用。TongRDS是沒有直接的下載地址的。…

Git鏈接備用手冊

三板斧及其他&#xff1a;git init&#xff1a;初始化git倉庫git add . :將所在文件夾中的所有文件加入到暫存區git commit -m 自定義記錄信息 &#xff1a;將暫存區中的數據放到Git的倉庫&#xff08;本地&#xff09;中&#xff0c;并進行記錄&#xff08;自定義&#xff0…

零信任網絡概念及在網絡安全中的應用

零信任網絡概念及在網絡安全中的應用 零信任網絡&#xff08;Zero Trust Network&#xff09;是一種顛覆傳統邊界安全的架構理念&#xff0c;其核心是**“永不信任&#xff0c;始終驗證”**&#xff08;Never Trust, Always Verify&#xff09;。它假設網絡內外均存在威脅&…

GaussDB case when的用法

1 case函數的類型case具有兩種格式&#xff0c;簡單case函數和case搜索函數。這兩種方式&#xff0c;大部分情況下可以實現相同的功能。1.1 簡單case函數語法case column when <condition> then value when <condition> then value ...... else value end;示例case…

Git用法記錄

代碼中沖突標記的含義&#xff1a;<<<<<<< HEAD 標記當前分支&#xff08;或本地&#xff09;的舊代碼作為分隔線 >>>>>>> [commit哈希] 標記從其他分支合并過來的新代碼&#xff08;這里的 c472b4b... 是提交哈希&#xff09; 暫存…

解決Android Studio中創建的模擬器第二次無法啟動的問題

Android Studio中創建的模擬器&#xff0c;首次啟動時一切正常。但是關閉模擬器&#xff0c;下一次啟動時一直顯示&#xff1a;Connecting to the Emulator&#xff0c;無法啟動。無法啟動的原因通常是默認開啟了模擬器的快速啟動功能&#xff0c;首次啟動時是“冷啟動”&#…

Linux設備驅動架構相關文章

學習一個領域&#xff0c;最好是從多個角度去學習&#xff0c;總有一個角度適合你。學習Linux驅動&#xff0c;從架構的角度把握&#xff0c;比直接看代碼更容易接受。以架構為主&#xff0c;結合細節學習&#xff0c;我稱之為自上而下的學習方法&#xff0c;就一個字&#xff…

YOLOv13 漢化優化部署版本:超圖增強自適應視覺感知的目標檢測系統

目錄 &#x1f4d6; 項目概述&#x1f680; YOLOv13 核心特性&#x1f4ca; 性能對比&#x1f5bc;? 可視化效果&#x1f527; 項目優化改進?? 快速部署指南?? 運行使用&#x1f4dd; 使用示例&#x1f527; 故障排除&#x1f31f; 項目特色&#x1f517; 相關鏈接&#…

uni-app webview的message監聽不生效(uni.postmessage is not a function)

uni-app開發app web-view組件message事件不觸發背景子頁面是h5&#xff08;非uni-app版&#xff09;子頁面是h5&#xff08;uni-app版&#xff09;背景 大致背景是 在uni-app開發的客戶端app中使用web-view嵌入h5頁面&#xff0c;在h5中通過postmessage API觸發父組件web-view…

【異常案例分析】使用空指針調用函數(非虛函數)時,沒有崩潰在函數調用處,而是崩在被調用函數內部

目錄 1、問題說明 2、代碼段地址與數據段地址 3、使用空指針調用BindWindow函數&#xff08;非虛函數&#xff09;&#xff0c;沒有崩在BindWindow函數的調用處&#xff0c;而是崩在函數內部 3.1、虛函數調用的二次尋址 3.2、崩潰在被調用函數內部 4、總結 C軟件異常排查…

鎖定中科院1區TOP!融合LSTM與Attention做時間序列預測 !

Transformer雖火&#xff0c;但在數據少、要求穩的時序預測場景中&#xff0c;LSTM仍是首選。尤其加上注意力機制后&#xff0c;更是彌補了LSTM的短板&#xff0c;增強了性能&#xff0c;實現了更精確的預測。這種組合不僅應用場景廣泛&#xff0c;工業界愛&#xff0c;學術界也…

在不可更改系統上構建數據響應機制的可選策略

在現代企業信息系統架構中&#xff0c;我們常常面臨如下挑戰&#xff1a;某個業務系統屬于“不可變更系統”&#xff0c;我們既不能修改其業務邏輯&#xff0c;也不能對其核心代碼做任何侵入式改動。但與此同時&#xff0c;我們又需要對該系統中的某些關鍵業務數據變更做出響應…

Docker 實戰 -- cloudbeaver

文章目錄前言文件目錄docker-compose.yml網絡連接前言 當你迷茫的時候&#xff0c;請點擊 Docker 實戰目錄 快速查看前面的技術文章&#xff0c;相信你總能找到前行的方向 上一篇文章 Docker 實戰 – Mysql 講述了用 docker 搭建 mysql 數據庫的過程, 連接數據庫的工具很多, …

Rust × WebAssembly 項目腳手架詳解

一、模板概覽 模板生成方式核心用途典型角色wasm-pack-templatecargo generate …把 Rust 代碼 打包成 npm 庫「底層算法/組件」作者create-wasm-appnpm init wasm-app構建純 JS/TS 項目&#xff0c;消費上面生成的 npm 包Web 前端/Node 服務rust-webpack-templatenpm init ru…

RSA 解密邏輯

以下是使用類的方式封裝 RSA 解密邏輯&#xff0c;使其更易于調用和管理&#xff1a; from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 import base64 class RSADecryptor:"""RSA 解密工具類&#xff0c;封裝解密邏輯&#xff0c;方便…