设计模式之:装饰模式

原创 2016年08月29日 15:18:27

装饰模式UML图
装饰模式用于动态的往组件(Component)上添加功能。主要使用的场所为:

  • 需要扩展一个类的功能,或给一个类增加附加责任。
  • 需要动态的给一个对象增加功能,这些功能可以再动态地撤销。
  • 需要增加一些基本功能的排列组合而产生的非常大量的功能。

就上图而言,待扩展的类就是ConcreteComponent,附属的职责或者功能就是ConcreteDecorator身上带有的工能。装饰模式比较强大的地方在于:1)可以动态添加或者撤销职责或者功能。2)可以实现功能的排列组合而不用通过继承的方式。

这里写图片描述
举一个穿衣服的例子,UML图如上,代码如下:

#include <string>
#include <unordered_set>
#include <iostream>
using namespace std;

class CAbstractAvator {
public:
    virtual void Decorate() = 0;
};

class CConcreteAvator : public CAbstractAvator{
    string m_name;
public:
    CConcreteAvator(const string& name) : m_name(name) {}
    void Decorate() override 
    {
        cout << "I'm " << m_name << ", I'm wearing: " << endl;
    }
};

class CAbstractDecorator : public CAbstractAvator{
protected:
    CAbstractAvator* pAvator = nullptr;
public:
    CAbstractDecorator(CAbstractAvator* p) : pAvator(p) {}
};

class CUnderWearDecorator : public CAbstractDecorator {
public:
    CUnderWearDecorator(CAbstractAvator* p) : CAbstractDecorator(p) {}
    void Decorate() override {
        pAvator->Decorate();
        cout << "Underwear" << endl;
    }
};

class CTshirtDecorator : public CAbstractDecorator {
public:
    CTshirtDecorator(CAbstractAvator* p) : CAbstractDecorator(p) {}
    void Decorate() override {
        pAvator->Decorate();
        cout << "Tshirt" << endl;
    }
};

class CSweatersDecorator : public CAbstractDecorator {
public:
    CSweatersDecorator(CAbstractAvator* p) : CAbstractDecorator(p) {}
    void Decorate() override {
        pAvator->Decorate();
        cout << "Sweaters" << endl;
    }
};

class CCoatDecorator : public CAbstractDecorator {
public:
    CCoatDecorator(CAbstractAvator* p) : CAbstractDecorator(p) {}
    void Decorate() override {
        pAvator->Decorate();
        cout << "Coat" << endl;
    }
};

void main()
{
    CAbstractAvator *pAvator = new CConcreteAvator("avator");
    pAvator = new CUnderWearDecorator(pAvator);
    pAvator = new CTshirtDecorator(pAvator);
    pAvator = new CSweatersDecorator(pAvator);
    pAvator = new CCoatDecorator(pAvator);
    pAvator->Decorate();
}

输出结果如下:

I'm avator, I'm wearing:
Underwear
Tshirt
Sweaters
Coat
版权声明:本文为博主原创文章,未经博主允许不得转载。

【Java设计模式】- 装饰器模式

概述     装饰器模式:可以动态的为运行时的类添加行为。相比继承而言,继承是直接对某个类的行为进行扩展而装饰器模式是对某个对象进行扩展。     原理:增加一个修饰类去实现被修饰类相同的接口,同...
  • LightOfMiracle
  • LightOfMiracle
  • 2017年06月26日 10:32
  • 245

研磨设计模式 之 装饰模式(Decorator)1——跟着cc学设计系列

22.1  场景问题 22.1.1  复杂的奖金计算        考虑这样一个实际应用:就是如何实现灵活的奖金计算。 奖金计算是相对复杂的功能,尤其是对于业务部门的奖金计算方式,是非常复杂的,...
  • u013019926
  • u013019926
  • 2013年12月05日 10:10
  • 676

Android设计模式之一个例子让你彻底明白装饰者模式(Decorator Pattern)

导读这篇文章中我不会使用概念性文字来说明装饰者模式,因为通常概念性的问题都很抽象,很难懂,使得读者很难明白到底为什么要使用这种设计模式,我们设计模式的诞生,肯定是前辈们在设计程序的时候遇到了某种困难,...
  • nugongahou110
  • nugongahou110
  • 2015年12月27日 19:40
  • 2972

设计模式——装饰模式(Decorator)

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 设计模式学习笔记 ——Shulin 转载请注明出处:http://blog.csdn.net/zhshulin 1、概念 ...
  • u012909091
  • u012909091
  • 2014年08月18日 20:23
  • 18623

设计模式-装饰者模式(Go语言描述)

什么是装饰者模式好久没有更新设计模式系列的博客了, 今天我们来聊一聊装饰者模式, 用过java的同学肯定对装饰者模式非常熟悉,就算你不知道什么是装饰者模式这概念, 你也一定在代码中经常用到这个模式,为...
  • qibin0506
  • qibin0506
  • 2016年04月07日 08:55
  • 5373

设计模式之装饰模式和代理模式区别与联系

一.你在一个地方写装饰,大家就知道这是在增加功能,你写代理,大家就知道是在限制      1.最常见的代理就是权限判断了,权限就肯定是限制了      2.装饰模式是指增强被包装对象的功能   ...
  • sky_100
  • sky_100
  • 2016年09月13日 17:32
  • 10159

调侃《HeadFirst设计模式》之装饰者模式

今天让我们继续跟随《Head First 设计模式》的足迹,聊一个新的设计模式,有了它,你将能够在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责。首先,按照惯例,从故事说起——    ...
  • sinat_23092639
  • sinat_23092639
  • 2015年04月05日 10:52
  • 870

简单Java代码实例助你通俗易懂的理解什么是装饰(者)设计模式 (Decorator)

首先抛开到处都有的文字概念。来看下面的例子。 现在以:人吃饭。这个需求为例。来讲解这个设计模式。 1.0:想当年,人们都比较朴实。吃饭就是简简单单的吃饭。 那么PersonBefore类里面一个简单的...
  • qq_27093465
  • qq_27093465
  • 2016年11月24日 15:34
  • 1017

设计模式-装饰模式(理解)

看了《大话设计模式》pdf版的装饰模式和其他博客上的一些讲解,第一遍很难get到讲解的点在哪。经国深思,记录下深思的结果。 装饰模式,其实就是用递归的方式实现了面向切面(接口)编程。面向切面...
  • Scalaaaaaa
  • Scalaaaaaa
  • 2016年07月12日 15:22
  • 262

Java 设计模式 装饰者模式

装饰者模式 在设计的时候,往往要给一个对象的功能进行一些修饰,对功能进行拓展和增强,以满足我们的需求。    举个例子,最近流行歌曲比赛,什么《中国好声音》,《中国好歌曲》什么的,对于一个参赛者而言...
  • u010349169
  • u010349169
  • 2014年02月09日 23:57
  • 5834
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之:装饰模式
举报原因:
原因补充:

(最多只允许输入30个字)