博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装饰器模式
阅读量:3941 次
发布时间:2019-05-24

本文共 1335 字,大约阅读时间需要 4 分钟。

装饰模式: 动态地给一个对象添加一些额外的指责,就增加功能来书,装饰模式比生成子类更为灵活。

在这里插入图片描述

装饰模式是唯一有的功能动态地添加更多功能地一种方式。

在最初设计的时候,当系统需要新功能的时候,是向旧的类中添加新的代码。这些新的代码通常修饰了原有类的核心指责或主要行为。
在主类中添加新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足一些只在某种特定的情况下才会执行的特殊需求。
装饰模式却提供了一个非常好的解决方案,他把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要特殊的行为的时候,客户代码就可以在运行的时候根据需要有选择地、按顺序地私用装饰功能包装对象了。

优点:

有效地把类的核心指责和装饰地功能分开,而且可以去除相关类地重复地修饰逻辑

#include 
#include
using namespace std;class Person{
public: Person(){
} Person(string n):name(n){
} virtual void Show() {
cout << name << "穿着" << dress << endl; } string &GetDress() {
return dress; }private: string name; string dress;};class Finery:public Person{
protected: //装饰器中保存真实对象引用或指针,以便可以动态地位对象增加一些新的功能 Person *person;public: virtual void Decorate(Person &p) = 0; virtual void Show() {
person->Show(); }};class TS:public Finery{
public: virtual void Decorate(Person &p) {
p.GetDress() = p.GetDress() + " 大T恤 "; this->person = &p; } virtual void Show() {
person->Show(); } };class KZ:public Finery{
public: virtual void Decorate(Person &p) {
p.GetDress() = p.GetDress() + " 裤子 "; this->person = &p; } virtual void Show() {
person->Show(); }};int main(){
Person *per = new Person("妹子"); TS *ts = new TS(); KZ *kz = new KZ(); ts->Decorate(*per); ts->Show(); kz->Decorate(*per); kz->Show(); return 0;}

转载地址:http://hxnwi.baihongyu.com/

你可能感兴趣的文章
看了这54句,你就看懂了人性
查看>>
PowerDesigner数据模型设计拾遗
查看>>
从Spring MVC扩展中学习OO设计(一)
查看>>
八招赚钱方法
查看>>
70个面试技巧,很实用哦
查看>>
Communication - The cardigans
查看>>
晒书名:已收藏O'Reilly出版社‘动物世界’系列图书(一)
查看>>
晒书名:已收藏O'Reilly出版社‘动物世界’系列图书(二)
查看>>
从银行WebService报文接口系统中,学习敏捷设计
查看>>
区分IE和Firefox浏览器的CSS样式写法
查看>>
2009语录
查看>>
歌剧威尔第《弄臣》女人善变无常 唱词 Verdi: La donna è mobile
查看>>
数据仓库学习网站及图书
查看>>
工资就像大姨妈
查看>>
Superheroes - Edguy 歌词
查看>>
My Love - Justin Timberlake 贾斯汀 汀布莱克
查看>>
[Spring AOP] 基于AspectJ的@AfterReturning注释示例(附参考书目)
查看>>
The Big Bang Theory歌词
查看>>
Eclipse自动注释模版
查看>>
《非诚勿扰2》台词
查看>>