c++设计模式概述之装饰器
类写的不够规范,目的是为了缩短篇幅,实际中请不要这样做。
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 : public house_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(std::nothrow) 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(std::nothrow) 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、输出