(四)装饰模式-C++实现

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

当需要改进类的某个功能,而不是该类创建的全部对象时,可以使用这种设计模式。

装饰模式中有四种角色;

1、抽象组件:我们需要改进的类的父类,是一个抽象类。定义了一些虚函数。

2、具体组件:也就是它的某些对象可能需要被改进。也叫做被装饰者。

3、装饰:它也是抽象组件的子类,并且还包含一个抽象组件的声明,用来保存被装饰者的引用。它可以是抽象类,也可是是非抽象类。

4、具体装饰:它是装饰的实例。

本例实现的是一个Bird,作为一个抽象组件,即需要被改进的。有三个文件,Bird.h 和Bird.cpp以及测试用的decorator.cpp

实现如下;

1、Bird.h

 1 /*
 2 抽象组件和具体组件的头文件声明
 3 */
 4
 5 #ifndef _BIRD_H_
 6 #define _BIRD_H_
 7
 8 //抽象组件
 9 class Bird{
10 public:
11     virtual int fly() = 0;
12
13 };
14 //具体组件(被装饰者)
15 class Sparrow : public Bird{
16 public:
17     int fly() override; //override代表它是重写的父类的虚函数
18 public:
19     const int DISTANCE = 100;
20 };
21
22 //装饰者 也继承抽象组件 (即抽象组件即可以指向被装饰者,也可以指向装饰者)
23 class Decorator : public Bird{
24 public:
25     Decorator(){}
26
27     Decorator(Bird* bird);
28
29 protected:
30     Bird *myBird; //并且依赖抽组件
31 };
32
33 //具体装饰者
34 class SparrowDecorator : public Decorator{
35 public:
36     SparrowDecorator(Bird *bird);
37     int fly() override;
38 private:
39     int eleFly();
40 public:
41     const int DISTANCE = 50;
42
43 };
44
45 #endif

2、Bird.cpp

 1 #include "Bird.h"
 2
 3 int Sparrow::fly()
 4 {
 5     return DISTANCE;
 6 }
 7
 8
 9 Decorator::Decorator(Bird *bird)
10 {
11     myBird = bird;
12 }
13
14 SparrowDecorator::SparrowDecorator(Bird *bird) :Decorator(bird)
15 {
16 }
17
18 int SparrowDecorator::fly()
19 {
20     int distance = 0;
21     distance = myBird->fly() + eleFly();
22     return distance;
23 }
24
25 int SparrowDecorator::eleFly()
26 {
27     return DISTANCE;
28 }

3、decorator.cpp

 1 #include <iostream>
 2 #include "Bird.h"
 3 using namespace std;
 4
 5 void needBird(Bird *bird)
 6 {
 7     int flyDistance = bird->fly();
 8     cout << "this bird can fly " << flyDistance << "mile" << endl;
 9
10 }
11
12
13 int main()
14 {
15     Bird *sparrow = new Sparrow(); //普通的鸟
16     Bird *sparrowDecorator1 = new SparrowDecorator(sparrow);
17     Bird *sparrowDecorator2 = new SparrowDecorator(sparrowDecorator1);
18     needBird(sparrowDecorator1);
19     needBird(sparrowDecorator2);
20     return 0;
21 }

装饰模式最重要的就是,“具体组件”和“装饰”都是抽象组件的子类,说明抽象组件的对象声明即可以存放“被装饰者”的引用,也可以存放“装饰者的引用”,这样一个“被装饰者”被装饰变为“装饰者”之后,还可以被装饰,即多次装饰。

时间: 2024-07-30 02:50:50

(四)装饰模式-C++实现的相关文章

Python设计模式

一.简单工厂模式 首先来看下工厂模式的原理图: 模式特点:工厂根据条件产生不同功能的类. 程序实例:四则运算计算器,根据用户的输入产生相应的运算类,用这个运算类处理具体的运算. 代码特点:C/C++中的switch...case...分支使用字典的方式代替. 使用异常机制对除数为0的情况进行处理. Python实现代码如下: #!/usr/bin/env python # -*- coding:utf-8 -*- # Author: Jason Wang class Operation: def

[jvm解析系列][十四]动态代理和装饰模式,带你看源码深入理解装饰模式和动态代理的区别。

不知道大家知不知道设计模式中有一种叫做装饰,举一个简单的例子. 一天一个年轻领导小王讲话:咳咳,我们一定要xxx抓紧xxxx学习xxx的精神!好,今天的会议结束! 然后有一个老领导李同志接过来说:那个我在补充两点,个别同志xxx,一定要注意xxx.好散会. 然后另一天小王同志又在讲话:xxx两手都要抓,xxxx一定要注意. 这个时候老周同志出来了:嗯,小王讲的很好,我还有几点要补充xxxx. 那么很明显,小王同志的讲话方法不是很让人满意,那么老李领导或者老周领导可以接过来继续装修一下.其实这就是

设计模式:(5)装饰模式

装饰模式: 顾名思义,就是装饰,比如手机套,用来装饰手机,但是,作为手机套的实现是不影响手机的,手机套就像一个装饰器.在比方,相框,相框花边,他们都是为了给相片添加新的额外的功能,但是这种功能本身不影响相片的性质. 行为模式 意图: 动态给一个对象添加额外的职责.就增加功能而言,装饰模式相比生成子类更为灵活. 比生成子类更灵活,确实,相比用继承方式去添加职责,装饰器模式表现非常灵活. 比如这样的例子,流操作,一开始有文件流和网络流,如果用继承的方式,我想得这样写: class Stream{ p

[工作中的设计模式]装饰模式decorator

一.模式解析 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的要点主要是: 1.需要对已有对象扩展新的功能,又不希望改变原有对象接口: 2.装饰者对象与原有对象需要继承相同接口,初始化装饰对象时将原有对象传入装饰对象: 3.可以对一个对象定义多个装饰着对象,进行分别装饰或者组合装饰 二.模式代码 1.抽象接口 package decorator.patten; public interface Component { pu

再次温故--装饰模式

今天学习python的时候遇到装饰器,文章说跟装饰模式差不多,想到之前看过的装饰模式,现在已经淡然忘却,重拾记忆,搜索装饰模式,自己有C#语法的基础也就找到一篇用C#语法写的,自己之前看到一个孙悟空的例子,结合这次,自己编写一遍. namespace ProTest { abstract class 齐天大圣 { public abstract void 变(); } class 孙悟空: 齐天大圣 { public override void 变() { Console.WriteLine("

JAVA设计模式之 装饰模式【Decorator Pattern】

一.概述 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活.装饰模式是一种对象结构型模式.装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系.在装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩充原有类的功能. 二.适用场景 装饰原有对象.在不改变原有对象的情况下扩展增强新功能/新特征..当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式. 三.UML类图 四

24种设计模式--装饰模式【Decorator Pattern】

装饰模式在中国使用的那实在是多,中国的文化是中庸文化,说话或做事情都不能太直接,需要有技巧的,比如说话吧,你要批评一个人,你不能一上来就说你这个做的不对,那个做的不对,你要先肯定他的成绩,表扬一下优点,然后再指出瑕疵,指出错误的地方,最后再来个激励,你修改了这些缺点后有那些好处,比如你能带更多的小兵,当个小头目等等,否则你一上来就是一顿批评,你瞅瞅看,肯定是不服气,顶撞甚至是直接“此处不养爷,自有养爷处”开溜哇.这是说话,那做事情也有很多,在山寨产品流行之前,假货很是比较盛行的,我在 2002

【白话设计模式四】单例模式(Singleton)

转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二]外观模式(Facade) [白话设计模式三]适配器模式(Adapter) [白话设计模式四]单例模式(Singleton) [白话设计模式五]工厂方法模式(Factory Method) [白话设计模式六]抽象工厂模式(Abstract Factory) [白话设计模式七]策

Android源码学习之装饰模式应用

主要内容: 装饰模式定义 装饰模式优势 装饰模式在Android源码中的应用 一.装饰模式定义 装饰模式定义: Attach additional responsibilities to an object dynamically keeping the same interface. Decoators provide a flexible alternative to subclassing for extending functionality. 动态地给一个对象添加一些额外的职责.就增加