設計模式-裝飾器

? ? ? ? 裝飾器模式是一種結構型設計模式,它允許在運行時擴展一個對象的功能,而不需要改變其現有結構。這種模式的核心思想是通過創建一個裝飾器來動態地增強或修改原有對象的行為。裝飾器模式是繼承的一個補充,提供了比繼承更加靈活的方式來擴展對象的行為。

一、編碼

? 1、頭文件

#ifndef _DECORATE_H__
#define  _DECORATE_H__
#include <iostream>
using namespace  std;
/// 抽象被裝飾者
// template<class T,class U>  class Decoratee {
//     public:
//         virtual  U  execOpt(T t) = 0 ;
// };// template<class T,class U> class DecorateImpl: public Decoratee {
//      public:
//          U  execOpt(T t);
// };/// 抽象被裝飾者
class  Decoratee{public:int  value;virtual  void  decorateeOpt() = 0 ;
};/// 被裝飾者的具體實現
class DecorateeImpl : public Decoratee{public: DecorateeImpl();void  decorateeOpt() override;
};/// 定義裝飾器接口
class  Decorator : public Decoratee {protected:Decoratee* decoratee;public:/// @brief  裝飾器增強方法virtual  void  decoratorOpt() = 0;
};/// 擴展裝飾器A
class  DecoratorImplA : public Decorator {public:DecoratorImplA(Decoratee* decoratee);void  decorateeOpt() override;  void  decoratorOpt() override;
};/// 擴展裝飾器B
class  DecoratorImplB : public Decorator {public:DecoratorImplB(Decoratee* decoratee);void  decorateeOpt() override;  void  decoratorOpt() override;
};#endif

?2、函數定義

#include "decorate.h"// template<class T,class U>
// U  DecorateImpl<T,U>::execOpt(T t) {
//     cout << "" << endl;
// }DecorateeImpl::DecorateeImpl(){this->value = 1;
}void  DecorateeImpl::decorateeOpt(){this->value = this->value + 2; cout << "DecorateeImpl  execOpt  value = " << this->value << endl;
}DecoratorImplA::DecoratorImplA(Decoratee* decoratee) {this->decoratee = decoratee ;
}void  DecoratorImplA::decorateeOpt(){if(this->decoratee== nullptr){return;}this->decoratee->decorateeOpt();this->decoratorOpt();
}void  DecoratorImplA::decoratorOpt(){this->decoratee->value =  this->decoratee->value * 5;cout << "DecoratorImplA  execOpt  value = " <<  this->decoratee->value << endl;
}DecoratorImplB::DecoratorImplB(Decoratee* decoratee) {this->decoratee = decoratee ;
}void  DecoratorImplB::decorateeOpt(){if(this->decoratee== nullptr){return;}this->decoratee->decorateeOpt();DecoratorImplB::decoratorOpt();
}void  DecoratorImplB::decoratorOpt(){this->decoratee->value =  this->decoratee->value * 10;cout << "DecoratorImplB  execOpt  value = " <<  this->decoratee->value << endl;
}

二、測試

Decoratee*  decoratee = new DecorateeImpl();
Decorator*  decoratorA = new DecoratorImplA(decoratee);
Decorator*  decoratorB = new DecoratorImplA(decoratee);
decoratorA->decorateeOpt();
decoratorB->decorateeOpt();

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

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

相關文章

在線JSON可視化工具--改進

先前發布了JSON格式化可視化在線工具&#xff0c;提供圖形化界面顯示結構關系功能&#xff0c;并提供JSON快速格式化、JSON壓縮、快捷復制、下載導出、對存在語法錯誤的地方能明確顯示&#xff0c;而且還支持全屏&#xff0c;極大擴大視野區域。 在線JSON格式化可視化工具 但…

Cannot load configuration class: com.xxx.NacosConfigApplication

Cannot load configuration class: com.xxx.NacosConfigApplication 無法啟動成功 表象錯誤的日志信息解決方案結言 表象 最簡單的Spring Boot maven 配置 properties配置 啟動類&#xff0c;但是&#xff0c;就是無法啟動成功。 錯誤的日志信息 java.lang.IllegalStateEx…

Java面試題系列 - 第1天

題目&#xff1a;解釋Java中的垃圾回收機制&#xff08;GC&#xff09;并描述至少兩種不同的垃圾回收算法。 背景說明&#xff1a;Java的垃圾回收機制是其自動內存管理的關鍵特性之一&#xff0c;它自動追蹤并回收不再使用的對象所占用的內存空間&#xff0c;從而避免了手動管…

硅紀元AI應用推薦 | 國產創作引擎即夢AI助力創作者探索創作新境界

“硅紀元AI應用推薦”欄目&#xff0c;為您精選最新、最實用的人工智能應用&#xff0c;無論您是AI發燒友還是新手&#xff0c;都能在這里找到提升生活和工作的利器。與我們一起探索AI的無限可能&#xff0c;開啟智慧新時代&#xff01; 在人工智能快速發展的今天&#xff0c;各…

怎么還有人分不清路由器、交換機、光貓、WiFi……你真的都了解嗎?

號主&#xff1a;老楊丨11年資深網絡工程師&#xff0c;更多網工提升干貨&#xff0c;請關注公眾號&#xff1a;網絡工程師俱樂部 下午好&#xff0c;我的網工朋友。 講某個具體技術&#xff0c;說不定你頭頭是道&#xff0c;但關于路由器、交換機、光貓、WiFi的知識細節&…

自然語言處理領域介紹及其發展歷史

自然語言處理領域介紹及其發展歷史 1 NLP2 主要任務3 主要的方法1 基于規則的方法&#xff08;1950-1980&#xff09;2 基于統計的方法&#xff08;傳統的機器學習的方法&#xff09;3 Connectionist approach&#xff08;Neural networks&#xff09; 1 NLP 自動的理解人類語…

新能源組合灶,一灶兩用(電燃灶+電陶爐),電生明火,無需燃料

在科技日新月異的今天&#xff0c;廚房電器的創新不斷為我們的生活帶來便捷與驚喜。華火新能源電燃灶&#xff0c;以其獨特的設計和卓越的性能&#xff0c;成為未來廚房的首選&#xff0c;為您打造全新的烹飪體驗。 中國人的烹飪文化源遠流長&#xff0c;講究火候的掌控和明火烹…

Android系統system.exit(10);里面10代表的涵義,以及其他可以賦值數字可以是多少?

在Android系統中&#xff0c;System.exit(int status) 方法是Java語言提供的&#xff0c;用于終止當前正在運行的Java虛擬機&#xff08;JVM&#xff09;。在Android應用開發中&#xff0c;這個方法的使用并不常見&#xff0c;也不推薦&#xff0c;因為Android應用通常是通過其…

PHP電商系統開發指南高級技巧

開發高級 php 電商系統所需的技巧包括&#xff1a;數據庫優化&#xff1a;使用索引、規范化數據結構和緩存機制。性能優化&#xff1a;啟用頁面緩存、優化圖像和使用 cdn。購物車管理&#xff1a;使用會話或數據庫存儲數據&#xff0c;實現實時更新和棄單恢復。支付集成&#x…

[vue3+js]實現3d旋轉效果

1. 實現效果圖&#xff1a; 2.實現代碼&#xff1a; css: <style lang"scss" scoped>.bottomContainer{width: 1200px;height: 400px;display: flex;justify-content: center;position: relative;margin:200px auto;align-items: center;// background-image…

既美觀又方便的后臺框架誰需要?進來就對了。

一套既美觀又方便的后臺框架可以大大幅節約開發時間和成本。 我們來一起看看幾個明朗大氣的管理控制臺頁面。 本文檔會持續更新 模板編號&#xff1a;翠花_001模板編號&#xff1a;翠花_002模板編號&#xff1a;翠花_003

01 centos7中cmake配置crow開發環境

一、搭建開發環境 1.1 c開發環境 yum -y install gcc gcc-c gdb git1.2 安裝crow所需依賴 yum install boost boost-devel yum install openssl openssl-devel1.3 安裝cmake_3.27.9 可以借鑒此安裝&#xff1a;https://blog.csdn.net/i_coding_/article/details/131883590 …

nginx的匹配及重定向

一、nginx的匹配&#xff1a; nginx中location的優先級和匹配方式&#xff1a; 1.精確匹配&#xff1a;location / 對字符串進行完全匹配&#xff0c;必須完全符合 2.正則匹配&#xff1a;location ^~ ^~ 前綴匹配&#xff0c;以什么為開頭 ~區分大小寫的匹配 ~* 不區分…

IDEA:插件和配置推薦(2024版)

文章目錄 一、插件1.1 主題1.2 代碼縮略圖1.3 Maven插件2.4 彩虹括號2.5 翻譯插件2.6 圖標插件2.7 MyBatis插件2.8 阿里巴巴開發規范 二、全局配置2.1 主題2.2 字符編碼2.3 注釋顏色2.4 自動導包2.5 鼠標控制界面大小 三、新項目設置3.1 Maven3.2 SDK 四、恢復初始化 一、插件 …

SpringBoot 多數據源配置

目錄 一. 引入maven依賴包 二. 配置yml 三、創建 xml 分組文件 四、切換數據源 一. 引入maven依賴包 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.6.1&…

【Linux】Linux用戶,用戶組,其他人

1.文件擁有者 初次接觸Linux的朋友大概會覺得很怪異&#xff0c;怎么“Linux有這么多用戶&#xff0c;還分什么用戶組&#xff0c;有什用呢&#xff1f;”&#xff0c;這個“用戶與用戶組”的功能可是相當健全而且好用的一個安全防護措施。 怎么說呢&#xff1f;由于Linux是個…

Redis數據結構—跳躍表skiplist

想象一下&#xff0c;你正在參加一場長跑比賽&#xff0c;跑道是一條直線&#xff0c;而且所有參賽者按照他們的號碼牌順序站好。現在&#xff0c;你的任務是從隊伍的一頭快速找到某個特定的參賽者。 如果跑道上只有你一個人在找人&#xff0c;你可能需要從頭開始&#xff0c;…

【C++】解決 C++ 語言報錯:Dangling Pointer

文章目錄 引言 懸掛指針&#xff08;Dangling Pointer&#xff09;是 C 編程中常見且危險的錯誤之一。當程序試圖訪問指向已釋放內存的指針時&#xff0c;就會發生懸掛指針錯誤。這種錯誤不僅會導致程序崩潰&#xff0c;還可能引發不可預測的行為和安全漏洞。本文將深入探討懸…