c++設計模式概述之裝飾器
阿新 • • 發佈:2020-08-12
類寫的不夠規範,目的是為了縮短篇幅,實際中請不要這樣做。
1、概述
想象一下修房子。當施工隊把房子框架結構做好了,牆刷上了水泥, 這時,工隊暫時沒有錢,裝修只能暫停了。 過了一段時間,工隊籌集了資金,繼續裝修,最後交給使用者。
這個過程中, 就和 裝飾器模式 很接近。 工隊前期,做好了房屋結構框架,刷上了水泥, 好比現有的類,這時,需要對其進行擴充套件,就好比房屋的後期裝修。裝飾器模式就和這個道理是一樣的。
下面示例
2、房屋基類
// 房子基類 class house { public: virtual void get_info() = 0; };
3、毛坯房刷上了水泥
// 拿到毛坯房,都是水泥牆,還沒有裝修 class house_my : public house { public: // 毛坯房拿到了,輸出基本資訊 void get_info() { cout << "毛坯房拿到了,都是水泥牆,還沒有裝修\n"; } };
4、工隊籌集了資金,準備i裝修,裝修時建立在現有的水泥房之上
// 定義一個抽象的裝修類,目的是為了保留現有物件的介面和屬性 class house_decorator : public house { public: // 初始化原有物件 void init(house *pinstance) {if (nullptr != pinstance) _phouse = pinstance; } // 為了輸出原始物件的介面 void get_info() { if (_phouse) _phouse->get_info(); } private: // 儲存原始介面 house *_phouse = nullptr; };
5、裝修計劃已經做好,下面開始裝修
// 現在開始裝修了,當然是基於原始的毛坯房 class house_decorator_my : publichouse_decorator { public: // 裝修是建立在毛坯房的基礎上 void init2(house *pinstance) { if (nullptr != pinstance) init(pinstance); } // 廚房裝修好了 void get_kitchen_info() { cout << "\n 廚房裝修好了\n"; } void get_drawing_room_info() { cout << "\n 客廳裝修好了 \n"; } };
6、房屋裝修好了,來看看結果:(裝飾器類呼叫)
// 嘗試呼叫房子裝修結果 void call_house_mode() { // 1、先拿到毛坯房 std::unique_ptr<house> phouse(new house_my); if (!phouse) { cout << "\n 毛坯房 還沒有修好\n"; return; } // 2、 輸出毛坯房資訊 cout << "\n 毛坯房結果:"; phouse->get_info(); // 3、 建立裝修工具 std::unique_ptr<house_decorator_my> phouse_decorator_my(new house_decorator_my); if (!phouse_decorator_my) { cout << "\n 房子還沒裝修好,再等等 \n"; return; } cout << "\n \n\n\n 毛坯房裝修完了,結果:\n"; // 初始化毛坯房 phouse_decorator_my->init(phouse.get()); // 看看裝修結果 phouse_decorator_my->get_info(); phouse_decorator_my->get_drawing_room_info(); phouse_decorator_my->get_kitchen_info(); }
7、輸出