(四)装饰模式-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】
装饰模式在中国使用的那实在是多,中国的文化是中庸文化,说话或做事情都不能太直接,需要有技巧的,比如说话吧,你要批评一个人,你不能一上来就说你这个做的不对,那个做的不对,你要先肯定他的成绩,表扬一下优点 ...
随机推荐
- asp.net C#发送邮件类
很久前写的一个简单邮件发送类分享给大家: using System; using System.Data; using System.Configuration; using System.Web; ...
- 在64位Windows7上安装64位Oracle11g
我一直在用Oracle10g数据库,最近想看看11g怎么样,就试着装了一下,在安装过程中遇到的麻烦还不少,幸好有搜索引擎,根据前辈的指点,磕磕绊绊地也将Oracle装上了,作一下记录,以后也许能用得着 ...
- 杭电acm2029-Palindromes _easy version
Problem Description “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串.请写一个程序判断读入的字符串是否是“回文”. Input 输入包 ...
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q4-Q5)
Question 4 You are designing a SharePoint 2010 application to store 50 GB of digital assets, includi ...
- Mac电脑清理硬盘"其他"
作为一个MacBook的使用者,无不感受到苹果对于系统和硬件的完美匹配. 苹果电脑不适合玩游戏,所以我只用它开发iOS使用.电脑里除了Xcode和常用办公软件与通讯软件以外,我没有装其他的任何大应用. ...
- 【读书笔记】iOS网络-同步请求,队列式异步请求,异步请求的区别
一,同步请求的最佳实践. 1,只在后台过程中使用同步请求,除非确定访问的是本地文件资源,否则请不要在主线程上使用. 2,只有在知道返回的数据不会超出应用的内存时才使用同步请求.记住,整个响应体都会位于 ...
- OC中的protocol
一. 简单使用 1. 基本用途 可以用来声明一大堆方法(不能声明成员变量) 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明 只要父类遵守了某个协议,就相当于子类也遵守了 2. 格式 协 ...
- Swift中的部分更新与旧版的区别
1. 函数中的外部变量名取消 “#”方式,仅能用直接命名方式 错误 func swift(#str :NSString){} 正确 func swift(str str :NSString){} 2. ...
- 手机屏幕滑动效果框架——flipsnap
下午有时间,研究了下手机网页开发方面的内容.其中关于手机手势滑屏操作.发现有比较好的jquery 插件--flipsnap. 官方网站:http://pxgrid.github.com/js-flip ...
- Blocks的实现
相关结构体与函数 __block_impl 存储block对应类型信息(属于哪个Block大类,以及对应的回调函数指针FuncPtr struct __block_impl { void *isa; ...