最近看到《设计之禅》的装饰器模式,特用C++实现了一遍,发现有些有意思的东西需要探究一下。
UML类图:
一. C++实现
#include <stdio.h> /// Base class Component { public: virtual ~Component(){} virtual int operate() = 0; }; /// ConcreteComponent class ConcreteComponent: public Component { public: ConcreteComponent() { } virtual ~ConcreteComponent() { printf("ConcreteComponent Destroy %#04x\n", this); } int operate() { printf("ConcreteComponent operate\n"); return 0; } }; /// Decorator class Decorator: public Component { public: virtual ~Decorator() { printf("Decorator destroy:%#04x base:%#04x\n", this, m_component); delete m_component; m_component = NULL; } protected: Component* m_component; }; /// ConcreteDecoratorA class ConcreteDecoratorA: public Decorator { public: explicit ConcreteDecoratorA(Component *ins) { m_component = ins; } ~ConcreteDecoratorA() { printf("ConcreteDecoratorA destroy:%#04x\n", this); } int operate() { int ret = m_component->operate(); printf("ConcreteDecoratorA operate\n"); return ret; } }; /// ConcreteDecoratorB class ConcreteDecoratorB: public Decorator { public: explicit ConcreteDecoratorB(Component *ins) { m_component = ins; } ~ConcreteDecoratorB() { printf("ConcreteDecoratorB destroy:%#04x\n", this); } int operate() { int ret = m_component->operate(); printf("ConcreteDecoratorB operate\n"); return ret; } }; // 检测指针是否释放 Component *p = NULL, *q = NULL, *h = NULL; /** * main */ int main(int argc, char **argv) { Component *component = new ConcreteComponent(); p = component; component = new ConcreteDecoratorA(component); q = component; component = new ConcreteDecoratorB(component); h = component; component->operate(); printf("Concrete:%#04x Concrete1:%#04x Concrete2:%#04x\n\n", p, q, h); // 内存是否泄露? delete component; component = NULL; return 0; }
装饰器模式提供比继承更有弹性的扩展方案,缺点产生了大量包装类,业务逻辑比较复杂。
上图实现是调用了三次new,却只delete一次,是否会发生内存泄露?
先看结果:
ConcreteComponent operate ConcreteDecoratorA operate ConcreteDecoratorB operate Concrete:0x21d9010 Concrete1:0x21d9030 Concrete2:0x21d9050 ConcreteDecoratorB destroy:0x21d9050 Decorator destroy:0x21d9050 base:0x21d9030 ConcreteDecoratorA destroy:0x21d9030 Decorator destroy:0x21d9030 base:0x21d9010 ConcreteComponent Destroy 0x21d9010
分析:在析构ConcreteDecoratorB后,会再析构父类Decorator,但此次的Decorator已被构造函数替换成ConcreteDecoratorA,则析构ConcreteDecoratorA,同理再析构ConcreteComponent。通过Componenet成员变量达到析构了所有堆变量,实在是高!
二. java IO
Java IO提供很多实用的工具类,各种read(), readLine() 调用,典型的装饰器模式。
FileInputStream fis = new FileInputStream("~/test.txt"); BufferedInputStream bis = new BufferedInputStream(fis); bis.read(b, off, len);
源码跟踪:
BufferedInputStream::read(b, off, len);
getInIfOpen().read(b, off, len);
InputStream::read(b, off, len);
BufferedInputStream利用缓冲输入改善行为,底层调用FileInputStream的read(),而FileInputStream调用InputStream的read()。
相关推荐
Spring 设计模式之装饰器模式详解 在软件设计中,经常会遇到需要在不修改原有代码的情况下,添加新的功能或行为。这时,装饰器模式便可以发挥其作用。在 Spring 设计模式中,装饰器模式是非常重要的一种设计模式。 ...
【Java设计模式之装饰器模式】装饰器模式是一种结构型设计模式,它的主要目的是在不修改已有对象的前提下,通过添加额外的职责来扩展对象的功能。这种模式遵循单一职责原则,使得扩展职责时不会破坏原有对象的结构。...
在前端开发中,装饰器模式常用于实现AOP(面向切面编程),比如日志记录、性能监控、权限控制等功能。通过定义装饰器函数,可以在不侵入原代码逻辑的情况下,控制代码的执行流程。例如,可以创建一个`logDecorator`...
装饰器模式是23种经典设计模式中的一种结构型模式,它允许动态地给一个对象添加额外的职责,就像给一个礼物进行包装一样,可以在不改变其自身的情况下,为其增加新的功能或行为。 在PHP中,装饰器模式的实现通常...
二、编程实现一个咖啡售卖模块,咖啡店需要售卖各种各样的组合咖啡:基本的黑咖啡,10元加糖 2元加冰 1元加奶 3元加巧克力 4元而且每种添加料可以重复添加。最后显示示例为:加糖加冰加奶的黑咖啡 16元。...
本文实例讲述了PHP设计模式之装饰器模式定义与用法。分享给大家供大家参考,具体如下: 装饰器模式: 如果已有对象的部分内容或功能性发生改变,但是不需要修改原始对象的结构或不使用继承,动态的扩展一个对象的...
装饰器模式是一种结构型设计模式,它允许在不修改对象本身的情况下动态地为对象添加新的行为或职责。这种模式在软件工程中广泛应用,特别是在需要扩展已有功能而不影响原有代码结构时。在iOS开发中,装饰器模式同样...
c++设计模式-结构型模式-装饰器模式;QT工程;c++简单源码; 装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
装饰器模式是面向对象设计模式的一种,主要用于在不改变原有对象结构的情况下,动态地为对象增加新的功能。这种模式在Java中尤其常见,因为它允许我们遵循“开闭原则”——对扩展开放,对修改关闭。 装饰器模式的...
6. **工具应用**:在实际开发中,装饰模式常与其他设计模式结合使用,如工厂模式用于创建装饰器对象,策略模式用于选择合适的装饰策略。通过理解装饰模式,开发者可以更好地利用现有的工具库,或者设计出更灵活、可...
总的来说,装饰者模式是一种强大的设计模式,它提供了一种在运行时动态调整对象行为的方法,使得代码更具灵活性和可扩展性。通过理解和熟练运用装饰者模式,我们可以更好地应对软件需求的变化,提高代码的可维护性和...
Java 设计模式 - 装饰器模式 装饰器模式(Decorator Pattern)是一种结构性设计模式,它允许您在不影响同一类的其他对象的行为的情况下,静态或动态地向单个对象添加行为。该模式非常有用,当您想要在运行时添加或...
装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...
装饰模式是一种结构型设计模式,它允许在运行时给对象添加新的行为或责任,而无需修改对象的源代码。在Java中,装饰模式通常通过继承和组合来实现,提供了比子类化更灵活的方式来扩展对象的功能。 装饰模式的核心...
装饰者模式是面向对象设计模式的一种,主要用于动态地给一个对象添加一些额外的职责,而不会改变该对象的类。这种模式允许我们独立于对象的类来扩展对象的功能,为对象提供新的行为,同时保持了代码的可读性和可维护...
"设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式不仅对面试有所帮助,也是职场发展中的必备技能,无论你使用哪种开发语言。 设计...
在实现中,装饰器模式通常遵循以下步骤: 1. 定义组件接口。 2. 创建原始组件类,实现接口。 3. 创建装饰器类,包含对组件的引用,并实现组件接口。 4. 创建具体装饰器类,扩展装饰器类,添加新的行为。 5. 在客户端...