1.装饰者模式 Decorator

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

每个装饰对象的实现和如何使用这个对象分离,  每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链中。

实例:

人和衣服的装饰关系。

person.h   Person类

#ifndef PERSON_H
#define PERSON_H #include <string>
#include <iostream>
using namespace std; class Person
{
public:
Person();
Person(string name);
void virtual show(); private:
string name; }; #endif // PERSON_H

person.cpp

#include "person.h"

Person::Person()
{
} Person::Person(string name)
{
this->name = name;
} void Person::show()
{
cout << " <-name-> " << name << endl;
}

finery.h

#ifndef FINERY_H
#define FINERY_H #include "person.h" class Finery : public Person
{
public:
Finery();
void Decorate(Person *person);
void show(); protected:
Person *person; }; #endif // FINERY_H

finery.cpp

#include "finery.h"

Finery::Finery()
{
} void Finery::Decorate(Person* person)
{
this->person = person;
} void Finery::show()
{
if(person != NULL)
person->show();
}

tshirts.h 装饰者

#ifndef TSHIRTS_H
#define TSHIRTS_H #include "finery.h" class TShirts : public Finery
{
public:
TShirts();
void show();
}; #endif // TSHIRTS_H

tshirts.cpp

#include "tshirts.h"

TShirts::TShirts()
{
} void TShirts::show()
{
cout << " TShirts " << endl;
Finery::show();
}

bigtrouser.h

#ifndef BIGTROUSER_H
#define BIGTROUSER_H #include "finery.h" class BigTrouser : public Finery
{
public:
BigTrouser();
void show();
}; #endif // BIGTROUSER_H

bigtrouser.cpp

#include "bigtrouser.h"

BigTrouser::BigTrouser()
{
} void BigTrouser::show()
{
cout << " BigTrouser " << endl;
Finery::show();
}

main.cpp

#include <iostream>
#include "tshirts.h"
#include "bigtrouser.h"
#include "person.h" using namespace std; int main()
{
cout << "Hello World!" << endl; Person *person = new Person("kevin"); TShirts *tshirt = new TShirts();
BigTrouser *bigT = new BigTrouser(); tshirt->Decorate(person);
bigT->Decorate(tshirt);
bigT->show(); return 0;
}

大话设计模式--装饰者模式 Decorator -- C++实现实例的更多相关文章

  1. 浅谈设计模式--装饰者模式(Decorator Pattern)

    挖了设计模式这个坑,得继续填上.继续设计模式之路.这次讨论的模式,是 装饰者模式(Decorator Pattern) 装饰者模式,有时也叫包装者(Wrapper),主要用于静态或动态地为一个特定的对 ...

  2. 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 用法

    装饰者模式(Decorator Pattern) Java的IO类 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716 ...

  3. 设计模式 - 装饰者模式(Decorator Pattern) 具体解释

    装饰者模式(Decorator Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26707033 装饰者 ...

  4. 说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现

    返回目录 为何要设计多功能消息组件 之前写过一篇装饰器模式的文章,感觉不够深入,这次的例子是实现项目中遇到的,所以把它拿出来,再写写,之前也写过消息组件的文章,主要采用了策略模式实现的,即每个项目可以 ...

  5. C#设计模式——装饰者模式(Decorator Pattern)

    一.例子在软件开发中,我们往往会想要给某一类对象增加不同的功能.比如要给汽车增加ESP.天窗或者定速巡航.如果利用继承来实现,就需要定义无数的类,Car,ESPCar,CCSCar,SunRoofCa ...

  6. 说说设计模式~装饰器模式(Decorator)

    返回目录 装饰器模式,也叫又叫装饰者模式,顾名思义,将一个对象进行包裹,包装,让它变成一个比较满意的对象,这种模式在我们平时项目开发中,经常会用到,事实上,它是处理问题的一种技巧,也很好的扩展了程序, ...

  7. 大话设计模式--享元模式 Flyweight -- C++实现实例

    1. 享元模式: 运用共享技术有效地支持大量细粒度的对象. 享元模式可以避免大量非常相似类的开销,在程序设计中,有时需要生成大量颗粒度的类实例来表示数据,如果能发现这些实例除了几个参数外基本都是相同的 ...

  8. 大话设计模式--中介者模式 Mediator --C++实现实例

    1. 中介者模式: 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立改变他们之间的交互. Mediator的出现减少了各个Colleague的耦 ...

  9. 【设计模式】Java设计模式 - 装饰者模式

    Java设计模式 - 装饰者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自 ...

随机推荐

  1. [转载]Axis2 and CXF的比较

    在Celtix 和XFire 宣布合并的同年,另一个著名开源Web 服务框架Axis 的后继者Axis2 也诞生了.Axis2 并非Axis 的2.0 版,而是完全重写了Axis 的新项目.作为功能和 ...

  2. linux修改root管理员密码

    以root 身份登录(SSH操作) 输入 passwd 命令 就可以看到提示输入新密码了 输入密码的时候是看不到字符的.

  3. eclipse JVM Tomcat 内存堆栈大小设置

    1,  设置Eclipse内存使用情况 修改eclipse根目录下的eclipse.ini文件 -vmargs  //虚拟机设置 -Xms40m //初始内存 -Xmx256m //最大内存 -Xmn ...

  4. LCD屏背光驱动调试心得---血的教训

    开发板:明远智睿MY-IMX6-EK140 内核源码:linux-3.14.52 背光驱动IC:MP3202 调光原理:通过开发板的核心板PWM4引脚控制MP3202的EN脚,输出不同的占空比从而达到 ...

  5. ubuntu安装源

    1.编辑sources.list文件 sudo vi /etc/apt/sources.list 添加以下安装源 #台湾源 deb http://tw.archive.ubuntu.com/ubunt ...

  6. 蒙特卡洛方法计算圆周率的三种实现-MPI openmp pthread

    蒙特卡洛方法实现计算圆周率的方法比较简单,其思想是假设我们向一个正方形的标靶上随机投掷飞镖,靶心在正中央,标靶的长和宽都是2 英尺.同时假设有一个圆与标靶内切.圆的半径是1英尺,面积是π平方英尺.如果 ...

  7. golang struct 定义中json``解析说明

    在代码学习过程中,发现struct定义中可以包含`json:"name"`的声明,所以在网上找了一些资料研究了一下 package main import ( "enco ...

  8. Windows server2008 搭建ASP接口訪问连接oracle数据库全过程记录

    真的是太不easy了,曾经的时候在window server 2003上面搭建了一套asp+oracle的接口系统.就费了好大的劲儿,事实上那会迷迷瞪瞪的也不知道怎么的就弄好了,也懒得管了.OK,从昨 ...

  9. web安全之SQL注入---第四章 如何进行SQL注入攻击

    第四章 如何进行SQL注入攻击1.数字注入2.字符串注入    '#    '--

  10. Laravel 手记(连接mysql)

    这几天学习Laravel框架遇到了数据库方面的问题. PDOException in Connector.php line 55:SQLSTATE[HY000] [1045] Access denie ...