/************************************************************************ * 裝飾模式學習筆記[C++] * Author: 陳相禮 * Time: 2009.12.02 * Compiler: VC8 ************************************************************************/ #include "DecoratePattern.h" #include "DecoratePattern1.h" #include <iostream> using namespace std; int main() { //------------------裝飾模式原理類測試------------------- CConcreteComponent *cc = new CConcreteComponent(); CConcreteDecoratorA *ca = new CConcreteDecoratorA(); CConcreteDecoratorB *cb = new CConcreteDecoratorB(); ca->vSetComponent( cc ); cb->vSetComponent( ca ); cb->vOperation(); delete(cc); delete(ca); delete(cb); //------------------換裝類測試------------------- CPerson *cp = new CPerson( "Rainleaf" ); cout << "第一種裝束:" << endl; // 獲取裝束 CSneakers *csk = new CSneakers(); CTShirts *cts = new CTShirts(); CBigTrouser *cbt = new CBigTrouser(); // 開始裝束 csk->vDecorate( cp ); cts->vDecorate( csk ); cbt->vDecorate( cts ); // 展示 cbt->vShow(); delete(csk); delete(cts); delete(cbt); cout << "第二種裝束:" << endl; // 獲取裝束 CLeatherShoes *cls = new CLeatherShoes(); CTie *ct = new CTie(); CSuit *cst = new CSuit(); // 開始裝束 cls->vDecorate( cp ); ct->vDecorate( cls ); cst->vDecorate( ct ); // 展示 cst->vShow(); delete(cls); delete(ct); delete(cst); return 0; } /************************************************************************ * 總結: * 1、裝飾模式是爲已有功能動態地添加更多功能的一種方式。 * 2、當系統需要新功能的時候,是向舊的類中添加新的代碼。這些新加的 * 代碼通常裝飾了原有類的核心職責或主要行爲。 * 3、在主類中加入了新的字段,新的方法和新的邏輯,從而增加了主類的 * 複雜度,而這些新加入的東西僅僅是爲了滿足一些只是在某種情況下 * 纔會執行的特殊行爲的需要。裝飾模式卻提供了一個非常好的解決方 * 案,它把每個要裝飾的功能在單獨的類中,並讓這個類包裝它所要裝 * 飾的對象,因此,當需要執行特殊行爲時,客戶代碼就可以在運行時 * 根據需要有選擇地、按順序地使用裝飾功能包裝對象。 * 4、裝飾模式優點:有效地把類的核心職責和裝飾功能區分開了。而且可 * 以去除相關類中重複裝飾的邏輯。 ************************************************************************/
#pragma once /********************************************** * 裝飾模式原理: * 動態給一個對象添加一些額外的職責,就 * 增加功能來說,裝飾模式比生成子類給爲靈活。 ***********************************************/ #include <iostream> using namespace std; //--------------------------------------------- // 對象接口類 // 定義一個對象接口,可以給這些對象動態 // 地添加職責。 class CComponent { public: virtual void vOperation() {}; }; //--------------------------------------------- // 具體對象類 // 定義一個具體對象,也可以給這些對象添 // 加職責。 class CConcreteComponent : public CComponent { public: void vOperation() { cout << "具體對象的操作" << endl; } }; //--------------------------------------------- // 裝飾抽象類 // 從外類來擴展CComponent類的功能,但 // CComponent類無需知道CDecorator類的存在。 class CDecorator : public CComponent { public: void vSetComponent( CComponent *pcompt ) {// 設置成員變量component pcomponent = pcompt; } // 重寫vOperation(),實際執行父類中的vOperation() virtual void vOperation() { if ( NULL != pcomponent ) { pcomponent->vOperation(); } } protected: CComponent *pcomponent; }; class CConcreteDecoratorA : public CDecorator { public: void vOperation() { CDecorator::vOperation(); dwAddedState = 100; cout << "具體裝飾對象A的操作" << endl; } private: // 本類獨有功能,以示區<mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js"></mce:script><mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js"></mce:script>別 double dwAddedState; }; class CConcreteDecoratorB : public CDecorator { public: void vOperation() { CDecorator::vOperation(); vAddedBehavior(); cout << "具體裝飾對象B的操作" << endl; } private: // 本類獨有功能,以示區別 void vAddedBehavior() { cout << "具體裝飾對象B獨有的方法" << endl; } };
#pragma once /******************************** * * 裝飾模式應用:形象展示 * ********************************/ #include <iostream> #include <string> using namespace std; // CPerson類(CConcreteComponent) class CPerson { public: CPerson() : strName(""){}; CPerson( string name ) : strName(name){}; virtual void vShow() { cout << "裝扮的" << strName << endl; } protected: private: string strName; }; // 服飾類(CDecorator) class CFinery : public CPerson { public: // 打扮 void vDecorate( CPerson *pcompt ) { pcomponent = pcompt; } // 展示 void vShow() { if ( NULL != pcomponent ) { pcomponent->vShow(); } } protected: CPerson *pcomponent; private: }; // 具體服飾類(CConcreteDecorator) class CTShirts : public CFinery { public: void vShow() { cout << "大T恤!" << endl; CFinery::vShow(); } protected: private: }; class CBigTrouser : public CFinery { public: void vShow() { cout << "跨褲!" << endl; CFinery::vShow(); } protected: private: }; class CSneakers : public CFinery { public: void vShow() { cout << "耐克!" << endl; CFinery::vShow(); } protected: private: }; class CLeatherShoes : public CFinery { public: void vShow() { cout << "長靴!" << endl; CFinery::vShow(); } protected: private: }; class CTie : public CFinery { public: void vShow() { cout << "領帶!" << endl; CFinery::vShow(); } protected: private: }; class CSuit : public CFinery { public: void vShow() { cout << "西服!" << endl; CFinery::vShow(); } protected: private: };
——By 陳相禮 09/12/02
本文分享自華爲雲社區《10分鐘搞懂各種內存溢出案例!!(含完整源碼,建議收藏)》,作者:冰 河。 作爲程序員,多多少少都會遇到一些內存溢出的場景,如果你還沒遇到,說明你工作的年限可能比較短,或者你根本就是個假程序員!哈哈,開個玩笑。今天,我
ClickHouse以性能好被大家所熟知,而一個數據庫的性能優化是一個龐大的系統性工程。本文着眼於ClickHouse內部的基礎數據結構,以揭露ClickHouse性能優化的冰山一角。 在軟件工程中並不是所有的執行路徑都需要優化,只有關鍵執
DevExpress VCL是DevExpress公司旗下最老牌的用戶界面套包,所包含的控件有:數據錄入、圖表、數據分析、導航、佈局等。該控件能幫助您創建優異的用戶體驗,提供高影響力的業務解決方案,並利用您現有的VCL技能爲未來構建下一代應
實質上,ReSharper特徵可用於C#,VB.net,XML,Asp.net,XAML,和構建腳本。 使用ReSharper,你可以進行深度代碼分析,智能代碼協助,實時錯誤代碼高亮顯示,解決方案範圍內代碼分析,快速代碼更正,一步完成代碼格
作者:太業 流式處理語言發展 早期流式處理概念: 20 世紀 70 年代,編程語言如 APL 提供了對數組的流式操作,這可以看作是流式處理語法的早期形式。 管道(Pipes)概念在 UNIX 系統中的引進使得可以通過命令行將一個命令的
Qt 是目前最先進、最完整的跨平臺C++開發工具。它不僅完全實現了一次編寫,所有平臺無差別運行,更提供了幾乎所有開發過程中需要用到的工具。如今,Qt已被運用於超過70個行業、數千家企業,支持數百萬設備及應用。 本文將爲大家演示如何使用QRh
pt-osc原理探索及其觸發器的深入分析 > 作者:莫善,某互聯網公司高級 DBA。 > > 愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 > > 本文約 6000 字,預計閱讀需要 20 分鐘。 背景 自工
文|苟振東(花名:盛知) Koupleless 項目 committer 螞蟻集團技術專家 本文 5789 字 閱讀 12 分鐘 本篇文章屬於 Koupleless 進階系列文章第二篇,默認讀者對 Koupleless 的基礎概念、能力都
1. 引言 在現代軟件開發過程中,性能優化和故障排查是保證應用穩定運行的關鍵任務之一。Java作爲一種廣泛使用的編程語言,其生態中湧現出了許多優秀的監控和診斷工具,諸如:SkyWalking、Zipkin等,它們幫助開發者和運維人員
· 前言 · 在國內,公網服務器與本地服務器的通信一直是個難題,本地服務器因爲IP是動態變化的,公網服務器沒辦法將請求發送給本地服務器。爲了解決這個問題,所以採用WebSocket協議替換Http協議。爲了實現請求等待,使用Gu
這個其實是一個特別高頻的面試題,松哥也一直很想和大家仔細來聊一聊這個話題,網上關於這塊的文章很多,但是我一直覺得要把這個問題講清楚還有點難度,今天我來試一試,看能不能和小夥伴們把這個問題梳理清楚,當然,如果小夥伴們覺得看文章不過癮,松哥也有
分享8個開箱即用的API,方便日常處理集合。 1. 快速過濾空值:Stream.ofNullable 該方法是在 Java 9 中引入的,有助於過濾集合中的所有空值,從而可能使我們避免空指針異常。 在下面的示例中,有一個包含 null 的L
一、背景 在日常部門OpsReview過程中,部門內多次遇到應用容器所在的宿主機磁盤繁忙導致的接口響應緩慢,TP99增高等影響服務性能的問題,其中比較有效的解決方案是開啓日誌的異步打印,可以有效避免同步日誌打印在磁盤IO高起的情況下拖慢業