《大话设计模式》c++实现 装饰者模式

一、UML图

 

介绍

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。

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

主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

何时使用:在不想增加很多子类的情况下扩展类。

如何解决:将具体功能职责划分,同时继承装饰者模式。

关键代码: 1、Component 类充当抽象角色,不应该具体实现。 2、修饰类引用和继承 Component 类,具体扩展类重写父类方法。

应用实例: 1、孙悟空有 72 变,当他变成"庙宇"后,他的根本还是一只猴子,但是他又有了庙宇的功能。 2、不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体。

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:多层装饰比较复杂。

使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。

注意事项:可代替继承。

 1 #include <iostream>
 2 #include<string>
 3
 4 //person 类
 5 class Person
 6 {
 7 public:
 8     Person(){};
 9     Person(std::string name);
10     virtual void Show();
11     //当你用一个基类指针或引用指向一个继承类对象的时候,
12     //调用一个虚函数时, 实际调用的是继承类的版本。
13
14
15 private:
16     std::string name;
17 };
18
19 Person::Person(std::string name)
20 {
21     this->name = name;
22 }
23
24 void Person::Show(){
25     //父类的函数
26     std::cout << "装饰的"<< name << std::endl;
27 }
28
29 //装饰类
30 //负责穿戴不同的服装 有一个参数是服装对象
31 class Finery :public Person{
32 protected:
33     Person* component;
34 public:
35     Finery(){};
36     void Decorator(Person* component);//穿衣服函数
37     void Show();
38 };
39
40 void Finery::Decorator(Person* component){
41     this->component = component;
42 }
43 void Finery::Show(){
44 //子类的函数
45     if (component != NULL)
46         component->Show();
47 }
48
49
50 //具体服装
51 class Tshirts :public Finery{
52 public:
53     Tshirts(){};
54     void Show(){
55         std::cout << "T shirts";
56         Finery::Show();
57     }
58 };
59
60 class Sneakers :public Finery{
61 public:
62     Sneakers(){};
63     void Show(){
64         std::cout << " Sneakers";
65         Finery::Show();
66     }
67 };
68
69
70
71 void main(){
72
73     Person* xc = new Person("小菜");
74     std::cout << "first style:" << std::endl;
75     Tshirts* ts = new Tshirts();
76     Sneakers* sn = new Sneakers();
77
78     ts->Decorator(xc);//小菜穿第一件衣服
79     sn->Decorator(ts);//小菜穿第二件衣服
80     sn->Show();
81
82
83     system("pause");
84 }

参考:

http://www.runoob.com/design-pattern/decorator-pattern.html

https://blog.csdn.net/xiqingnian/article/details/41866685

原文地址:https://www.cnblogs.com/zle1992/p/9743187.html

时间: 2025-01-17 20:36:43

《大话设计模式》c++实现 装饰者模式的相关文章

大话设计模式C++版——工厂方法模式

工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版--简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发-封闭原则,其主要原因是由于switch的判断结构的使用,使修改或添加新的对象时需要改动简单工厂类的代码,不符合开放-封闭原则,那么工厂方法模式会在那方面有所改进呢?我们仍以简单工厂模式中加减法计算器为例. 1.保持简单工厂模式的 IOperation 接口和实现对象(COperation_Add 和 COperation_

大话设计模式C++版——抽象工厂模式

前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种--抽象工厂模式(Abstract Factory),其是在工厂方法模式的基础上改进而来,如果没有弄明白工厂方法模式的同学请先观看<大话设计模式C++版--工厂方法模式>. 为什么会有抽象工厂模式?抽象工厂模式是简单工厂模式缺陷的终极解决方式么?NO,抽象工厂模式并不是为了解决简单工厂模式的缺陷而活着,它是因为有新的使命而诞生. 一个简单的例

大话设计模式读书笔记2——策略模式

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类直接的耦合. UML 图: 根据<大话设计模式>——第二章 商场促销这个案例代码来简单的记录一下策略模式的使用方式: /// <summary> /// 现金收费抽象类 /// </summary> public abstract class CashSuper { /// <summary> ///

设计模式C++实现——装饰者模式

模式定义: 装饰者模式动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 装饰者和被装饰者有相同的超累类型. 可以用一个或多个装饰者包装一个对象. 既然装饰者和被装饰者对象有相同的超累类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它. 装饰者可以委托被装饰者的行为之前与或之后,加上自己的行为,以达到特定的目的. 对象可以在任何时候被装饰,所以可以在运行时动态地.不限量地用你喜欢的装饰者来装饰对象. 模式结构: 举例: 购买咖啡时,可以在其中加入

&amp;lt;二&amp;gt;读&amp;lt;&amp;lt;大话设计模式&amp;gt;&amp;gt;之策略模式

又和大家见面了.可以坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>解说策略模式是以商场收银软件程序开头的,那么问题来了.哪家商场收银软件强,开玩笑了. 读过上篇文章<<简单工厂模式>>的知道,它有两个缺点:1.client依赖两个类.耦合性高:2.假设算法过多则须要写非常多类.解决上面问题的就是策略模式了. 策略模式:它定义了算法家族.分别封装起来.让它们之间能够互相替换,此模式让算法的变化,不会影响到使用算法的客户. 商场收银软件:单位价格*打

大话设计模式1.0.1-----工厂模式

大话设计模式 大话设计模式第一章之:工厂模式 客套话: 程序能运行不一定是最优的. 可维护,可扩展,可复用,灵活性好,避免重复(可以多一个环节来排除重复) 业务逻辑与界面逻辑的分开 类与对象 抽象类,虚方法实现不同功能 如调用不同功能,要使用不同类吗,只要使用一个基类,用swicth判断要使用什么功能,然后用子类初始化基类,就可以了. 一个最基础的类,继承会让所有的子类都拥有某种特性,为了实现一些可有可无的特性,可以使用接口. 原则: 尽可能的避免重复 只有分离才可以更好的维护和复用. 要复用,

大话设计模式1.0.2-----策略模式 单一职责原则 和 开放-封闭原则

大话设计模式第二章之:策略模式 算法之间可以互相调用 策略模式就是用来封装算法的. 大话设计模式第三章之:单一职责原则 单一职责原则:就一个类而言,应该仅有一个引起它变化的原因 类承担的职责不能过多,因为有时,完成一个职责,会影响到其他职责的, 手机只用来接电话,相机只用来拍照,功能才强大,集成太多了,其他功能就弱化了. 对应一些问题,要方法化,要类分离化 大话设计模式第四章之:开放-封闭原则 开放-封闭原则:是说软件实体(类.模块.函数等等)应该可以扩展,但是不可修改.OCP 扩展是开放的,修

大话设计模式C++版——简单工厂模式

简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类--依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class IOperation { public: IOperation() : m_nNuml(0), m_nNumr(0) {} virtual ~IOperation() {} virtual void SetNum(int nNuml = 0, int nNumr = 0) { m_nNuml = nN

&amp;lt;四&amp;gt;读&amp;lt;&amp;lt;大话设计模式&amp;gt;&amp;gt;之代理模式

代理模式我想大家即便不熟悉也都听过吧,从字面意思上看就是替别人干活的,比方代理商.在项目的实际应用中也有非常多地方用到.比方spring通过代理模式生成对象等. 代理模式的书面定义:为其它对象提供一种代理以控制对这个对象的訪问. 在某些情况下,一个对象不适合或者不能直接引用还有一个对象,而代理对象能够在client和目标对象之间起到中介的作用. 在<<大话设计模式>>一书中以一个有男朋友的女孩让"小菜"帮忙修电脑的故事展开的,事实上说白了代理就是帮别人干活的,一

大话设计模式-第一章-简单工厂模式

一.UML图 二.包含的角色 简单工厂模式包含三个角色:(1)工厂类Factory(2)抽象产品类AbstractProduct(3)具体产品类ConcreteProduct. (1)Factory:工厂类是用来制造产品的.因此,在Factory中有一个用于制造产品的Create函数或者Generate函数之类的函数.这个函数能够根据"标识符"的不同生成不同的ConcreteProduct,当然这些ConcreteProduct都是继承自AbstractProduct的. (2)Abs