装饰模式 向右看齐 2022-08-11 08:29 175阅读 0赞 转载自:[http://blog.csdn.net/wuzhekai1985/article/details/6672614][http_blog.csdn.net_wuzhekai1985_article_details_6672614]。 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。本文介绍装饰模式的实现。 装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。有时我们希望给某个对象而不是整个类添加一些功能。比如有一个手机,允许你为手机添加特性,比如增加挂件、屏幕贴膜等。一种灵活的设计方式是,将手机嵌入到另一对象中,由这个对象完成特性的添加,我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。下面给出装饰模式的UML图。 ![0_13128725192ROQ.gif][] 在这种设计中,手机的装饰功能被独立出来,可以单独发展,进而简化了具体手机类的设计。下面给出Phone类的实现: **\[cpp\]** [view plain][] [copy][view plain] [print][view plain] [?][view plain] 1. //公共抽象类 2. **class** Phone 3. \{ 4. **public**: 5. Phone() \{\} 6. **virtual** ~Phone() \{\} 7. **virtual** **void** ShowDecorate() \{\} 8. \}; 具体的手机类的定义: **\[cpp\]** [view plain][] [copy][view plain] [print][view plain] [?][view plain] 1. //具体的手机类 2. **class** iPhone : **public** Phone 3. \{ 4. **private**: 5. string m\_name; //手机名称 6. **public**: 7. iPhone(string name): m\_name(name)\{\} 8. ~iPhone() \{\} 9. **void** ShowDecorate() \{ cout<<m\_name<<"的装饰"<<endl;\} 10. \}; 11. //具体的手机类 12. **class** NokiaPhone : **public** Phone 13. \{ 14. **private**: 15. string m\_name; 16. **public**: 17. NokiaPhone(string name): m\_name(name)\{\} 18. ~NokiaPhone() \{\} 19. **void** ShowDecorate() \{ cout<<m\_name<<"的装饰"<<endl;\} 20. \}; 装饰类的实现: **\[cpp\]** [view plain][] [copy][view plain] [print][view plain] [?][view plain] 1. //装饰类 2. **class** DecoratorPhone : **public** Phone 3. \{ 4. **private**: 5. Phone \*m\_phone; //要装饰的手机 6. **public**: 7. DecoratorPhone(Phone \*phone): m\_phone(phone) \{\} 8. **virtual** **void** ShowDecorate() \{ m\_phone->ShowDecorate(); \} 9. \}; 10. //具体的装饰类 11. **class** DecoratorPhoneA : **public** DecoratorPhone 12. \{ 13. **public**: 14. DecoratorPhoneA(Phone \*phone) : DecoratorPhone(phone) \{\} 15. **void** ShowDecorate() \{ DecoratorPhone::ShowDecorate(); AddDecorate(); \} 16. **private**: 17. **void** AddDecorate() \{ cout<<"增加挂件"<<endl; \} //增加的装饰 18. \}; 19. //具体的装饰类 20. **class** DecoratorPhoneB : **public** DecoratorPhone 21. \{ 22. **public**: 23. DecoratorPhoneB(Phone \*phone) : DecoratorPhone(phone) \{\} 24. **void** ShowDecorate() \{ DecoratorPhone::ShowDecorate(); AddDecorate(); \} 25. **private**: 26. **void** AddDecorate() \{ cout<<"屏幕贴膜"<<endl; \} //增加的装饰 27. \}; 客户使用方式: **\[cpp\]** [view plain][] [copy][view plain] [print][view plain] [?][view plain] 1. **int** main() 2. \{ 3. Phone \*iphone = **new** NokiaPhone("6300"); 4. Phone \*dpa = **new** DecoratorPhoneA(iphone); //装饰,增加挂件 5. Phone \*dpb = **new** DecoratorPhoneB(dpa); //装饰,屏幕贴膜 6. dpb->ShowDecorate(); 7. **delete** dpa; 8. **delete** dpb; 9. **delete** iphone; 10. **return** 0; 11. \} 装饰模式提供了更加灵活的向对象添加职责的方式。可以用添加和分离的方法,用装饰在运行时刻增加和删除职责。装饰模式提供了一种“即用即付”的方 法来添加职责。它并不试图在一个复杂的可定制的类中支持所有可预见的特征,相反,你可以定义一个简单的类,并且用装饰类给它逐渐地添加功能。可以从简单的部件组合出复杂的功能。\[DP\] 在本文的例子中,我们定义了两个具体的手机类,iPhone类和NokiaPhone类,通过单独的装饰类为它们添加特性,从而组合出复杂的功能。 本人享有博客文章的版权,转载请标明出处 [http://blog.csdn.net/wuzhekai1985][http_blog.csdn.net_wuzhekai1985] [http_blog.csdn.net_wuzhekai1985_article_details_6672614]: http://blog.csdn.net/wuzhekai1985/article/details/6672614 [0_13128725192ROQ.gif]: /images/20220810/60ab7ded204e415ebc84333629fc45a1.png [view plain]: http://blog.csdn.net/wuzhekai1985/article/details/6672614# [http_blog.csdn.net_wuzhekai1985]: http://blog.csdn.net/wuzhekai1985
相关 装饰模式 转载自:[http://blog.csdn.net/wuzhekai1985/article/details/6672614][http_blog.csdn.net_wuzhe 向右看齐/ 2022年08月11日 08:29/ 0 赞/ 176 阅读
相关 装饰模式 装饰模式 1、他所应对的问题 装饰模式主要是应对,按现有业务返回的结果,无法满足新的业务的需要了。而新的业务只是在原有结果上进行了变动。 真的这种情况 如 悠悠/ 2022年07月17日 15:26/ 0 赞/ 206 阅读
相关 装饰模式 装饰模式 装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。 即通过不同的组合方式,可以组合出各种不同的行为。 装饰模式结构图如 浅浅的花香味﹌/ 2022年06月05日 01:25/ 0 赞/ 192 阅读
相关 装饰模式 1.使用场景: 在已有的功能上边需要动态的添加新的功能。 2.UML表示 在装饰器模式中通常用以下的几类对象: 抽象构件角色(Project):给出一个接口, 骑猪看日落/ 2022年05月31日 09:27/ 0 赞/ 233 阅读
相关 装饰模式 定义 装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类模式更加灵活。 结构图 ![这里写图片描述][70] 装饰模式的简化: - 日理万妓/ 2022年05月14日 11:28/ 0 赞/ 214 阅读
相关 装饰模式 1、一个相片放入了相框,那么相框装饰了相片。相片相当于component类,相框相当于Decorator类。我们可以发现,相框里面包含一个相片,所以有了一个has-a的关系;但 àì夳堔傛蜴生んèń/ 2022年02月23日 14:40/ 0 赞/ 190 阅读
相关 装饰模式 Decorator装饰模式是一种结构型模式,它主要是解决:“过度地使用了继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩 本是古典 何须时尚/ 2022年02月23日 14:38/ 0 赞/ 201 阅读
相关 装饰模式 概述 23种设计模式之一,英文叫DecoratorPattern,中文也叫装饰模式、修饰模式。装饰模式是在不改变类文件和不使用继承的情况下,运行期动态扩展一个对象的功能。 迷南。/ 2022年02月16日 19:11/ 0 赞/ 194 阅读
相关 装饰模式 前言 装饰模式(Decorator),动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 一、Component抽象类 绝地灬酷狼/ 2021年12月09日 00:43/ 0 赞/ 230 阅读
相关 装饰模式 有抽象类名为早餐,现在具体的食物只需继承早餐抽象类,就可以作为早餐。 具体构件类,如只有breakfast抽象类和Hamburger类,满足需求。 如果需求改变,hamb 分手后的思念是犯贱/ 2021年09月28日 07:06/ 0 赞/ 290 阅读
还没有评论,来说两句吧...