(四)装饰模式-C++实现
动态地给对象添加一些额外的职责。就功能来说,装饰模式相比派生子类更为灵活。
当需要改进类的某个功能,而不是该类创建的全部对象时,可以使用这种设计模式。
装饰模式中有四种角色;
1、抽象组件:我们需要改进的类的父类,是一个抽象类。定义了一些虚函数。
2、具体组件:也就是它的某些对象可能需要被改进。也叫做被装饰者。
3、装饰:它也是抽象组件的子类,并且还包含一个抽象组件的声明,用来保存被装饰者的引用。它可以是抽象类,也可是是非抽象类。
4、具体装饰:它是装饰的实例。
本例实现的是一个Bird,作为一个抽象组件,即需要被改进的。有三个文件,Bird.h 和Bird.cpp以及测试用的decorator.cpp
实现如下;
1、Bird.h
/*
抽象组件和具体组件的头文件声明
*/ #ifndef _BIRD_H_
#define _BIRD_H_ //抽象组件
class Bird{
public:
virtual int fly() = ; };
//具体组件(被装饰者)
class Sparrow : public Bird{
public:
int fly() override; //override代表它是重写的父类的虚函数
public:
const int DISTANCE = ;
}; //装饰者 也继承抽象组件 (即抽象组件即可以指向被装饰者,也可以指向装饰者)
class Decorator : public Bird{
public:
Decorator(){} Decorator(Bird* bird); protected:
Bird *myBird; //并且依赖抽组件
}; //具体装饰者
class SparrowDecorator : public Decorator{
public:
SparrowDecorator(Bird *bird);
int fly() override;
private:
int eleFly();
public:
const int DISTANCE = ; }; #endif
2、Bird.cpp
#include "Bird.h" int Sparrow::fly()
{
return DISTANCE;
} Decorator::Decorator(Bird *bird)
{
myBird = bird;
} SparrowDecorator::SparrowDecorator(Bird *bird) :Decorator(bird)
{
} int SparrowDecorator::fly()
{
int distance = ;
distance = myBird->fly() + eleFly();
return distance;
} int SparrowDecorator::eleFly()
{
return DISTANCE;
}
3、decorator.cpp
#include <iostream>
#include "Bird.h"
using namespace std; void needBird(Bird *bird)
{
int flyDistance = bird->fly();
cout << "this bird can fly " << flyDistance << "mile" << endl; } int main()
{
Bird *sparrow = new Sparrow(); //普通的鸟
Bird *sparrowDecorator1 = new SparrowDecorator(sparrow);
Bird *sparrowDecorator2 = new SparrowDecorator(sparrowDecorator1);
needBird(sparrowDecorator1);
needBird(sparrowDecorator2);
return ;
}
装饰模式最重要的就是,“具体组件”和“装饰”都是抽象组件的子类,说明抽象组件的对象声明即可以存放“被装饰者”的引用,也可以存放“装饰者的引用”,这样一个“被装饰者”被装饰变为“装饰者”之后,还可以被装饰,即多次装饰。
(四)装饰模式-C++实现的更多相关文章
- 二十四种设计模式:装饰模式(Decorator Pattern)
装饰模式(Decorator Pattern) 介绍动态地给一个对象添加一些额外的职责.就扩展功能而言,它比生成子类方式更为灵活.示例有一个Message实体类,某个对象对它的操作有Insert()和 ...
- 【白话设计模式四】单例模式(Singleton)
转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...
- 设计模式--装饰模式Decorate(结构型)
一.装饰模式 动态地给一个对象添加额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活.有时我们希望给某个对象而不是整个类添加一些功能. 二.UML图 1.Component(概念中提到的对象接口 ...
- [工作中的设计模式]装饰模式decorator
一.模式解析 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的要点主要是: 1.需要对已有对象扩展新的功能,又不希望改变原有对 ...
- 基于东北F4的设计模式情景剧——第一幕 装饰模式(Decorator Pattern)
第一场 难题未解 布景:铁岭,晴天,午后,风.在一幢还算气派的写字楼的三层外墙上,挂着一条红色横幅,上面用歪歪扭扭的毛笔字写着"东北F4软件外包工作室".大风中,那早已褪色的条幅剧 ...
- 编程模式之装饰模式(Decorator)
装饰模式由四个角色组成:抽象组件角色,抽象装饰者角色,具体组件角色,具体装饰者角色. 抽象组件角色:给出一个抽象接口,以规范"准备接受附加功能"的对象. 抽象装饰者角色:持有一个组 ...
- [Effective Java]第四章 类和接口
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 第 13 章 装饰模式【Decorator Pattern】
以下内容出自:<<24种设计模式介绍与6大设计原则>> Ladies and gentlemen,May I get your attention,Please?,Now I’ ...
- 24种设计模式--装饰模式【Decorator Pattern】
装饰模式在中国使用的那实在是多,中国的文化是中庸文化,说话或做事情都不能太直接,需要有技巧的,比如说话吧,你要批评一个人,你不能一上来就说你这个做的不对,那个做的不对,你要先肯定他的成绩,表扬一下优点 ...
随机推荐
- mysql在Windows下使用mysqldump命令备份数据库
在cmd窗口中使用mysqldump命令首先需要配置环境变量 1,在计算机中找到MySQL的安装位置,找到MySQL Workbench,比如我的是C:\Program Files\MySQL\MyS ...
- 【position也可以很复杂】当弹出层遇上了鼠标定位(上)
前言 周五时同事有一个关于弹出层的问题没有解决,但是面临下班问题,我有点不舒服,便叫回去周六过来解决,但是上周六病了,所以请了个假,于是故事发生啦.... 今天上班时候,组员们卡到了那个地方,然后结果 ...
- PHP 后台定时循环刷新某个页面 屏蔽apache意外停止
PHP 后台定时循环刷新某个页面 如果间隔时间过长的话 会出现apache自动停止的现象.出现的原因则是设置了 <IfModule mpm_winnt_module> ThreadsPe ...
- 从零开始,做一个NodeJS博客(二):实现首页-加载文章列表和详情
标签: NodeJS 0 这个伪系列的第二篇,不过和之前的几篇是同一天写的.三分钟热度貌似还没过. 1 静态资源代理 上一篇,我们是通过判断请求的路径来直接返回结果的.简单粗暴,缺点明显:如果url后 ...
- HTML标签的嵌套
随着时间的推移,我们学习html的基础知识有了大概的了解.而我发现,平时在写html文档的时候,发现不太清楚标签之间的嵌套规则,经常是想到什么标签就用那些,然而发现有时的标签嵌套却是错误的.通过网上找 ...
- [ javascript canvas 插件演示 ] canvas 插件演示
<!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...
- go语言和资料
C/C++编程相关的复杂性,特别是大一点的工程的维护,如果人员较多,规范等都是较大的负担,最近正在关注go这么语言, 准备对于并发和系统级的开发引入. Go官网 http://golang.org h ...
- elipse + maven + tomcat + springMVC环境搭建
1. java JDK安装 http://jingyan.baidu.com/article/b24f6c82c989da86bfe5dab2.html 2.eclipse安装 http://jing ...
- centos初始配置
修改语言环境 [root@oracledb ~]# sudo vim /etc/sysconfig/i18n 将将zh_CH修改为"en_US.UTF-8" 搭建yum本地源 参考 ...
- SQL for SQLite
语法 verb + subject + predicate commannds(命令) SQL由命令组成,以分号为结束.命令有token组成,token由white space分隔,包括空格.tab. ...