`

[结构型模式] 装饰者模式的理解

 
阅读更多



头文件
//DecoratorPattern.h

#ifndef DECORATOR_PATTERN_H
#define DECORATOR_PATTERN_H

#include <Windows.h>
#include <iostream>
using namespace std;

namespace DecoratorPattern
{
    /*
    ** FileName     : DecoratorPatternDemo
    ** Author       : Jelly Young
    ** Date         : 2013/12/19
    ** Description  : More information, please go to http://www.jellythink.com
    */

    class Component
    {
    public:
        Component();
        virtual ~Component();
        virtual void Operation() = 0;
    };

    class ConcreteComponent : public Component
    {
    public:
        ConcreteComponent();
        virtual ~ConcreteComponent();
        virtual void Operation();
    };

    //
    //////////////////////////////////////////////////////////////////////////
    class Decorator : public Component
    {
    public:
        Decorator(Component* pComponent);
        virtual ~Decorator();
        virtual void Operation();

    protected:
        Component* m_pComponentObj;
    };

    class ConcreteDecoratorA : public Decorator
    {
    public:
        ConcreteDecoratorA(Component* pDecorator) ;
        virtual ~ConcreteDecoratorA();

        virtual void Operation();

        void  AddedBehavior();
    };

    class ConcreteDecoratorB : public Decorator
    {
    public:
        ConcreteDecoratorB(Component* pDecorator);
        virtual ~ConcreteDecoratorB();

        virtual void Operation();
        void  AddedBehavior();
    };

    //////////////////////////////////////////////////////////////////////////
    void DecoratorPattern_Test();
}

#endif


实现
#include "DecoratorPattern.h"

namespace DecoratorPattern
{
    Component::Component()
    {
    }

    Component::~Component()
    {
    }

    //
    //////////////////////////////////////////////////////////////////////////
    ConcreteComponent::ConcreteComponent()
    {
    }

    ConcreteComponent::~ConcreteComponent()
    {
    }

    void ConcreteComponent::Operation()
    {
        cout<<"I am no decoratored ConcreteComponent"<<endl;
    }
    

    //
    //////////////////////////////////////////////////////////////////////////
    Decorator::Decorator(Component *pComponent)
        : m_pComponentObj(pComponent)
    {}

    Decorator::~Decorator()
    {}

    void Decorator::Operation()
    {
        if (m_pComponentObj != NULL)
        {
            m_pComponentObj->Operation();
        }
    }

    //////////////////////////////////////////////////////////////////////////
    ConcreteDecoratorA::ConcreteDecoratorA(Component* pDecorator)
        : Decorator(pDecorator)
    {}

    ConcreteDecoratorA::~ConcreteDecoratorA()
    {}

    void ConcreteDecoratorA::Operation()
    {
        AddedBehavior();
        Decorator::Operation();
    }
    void  ConcreteDecoratorA::AddedBehavior()
    {
        cout<<"This is added behavior A."<<endl;
    }

    ConcreteDecoratorB::ConcreteDecoratorB(Component *pDecorator)
        : Decorator(pDecorator)
    {}
    ConcreteDecoratorB::~ConcreteDecoratorB()
    {}
    void ConcreteDecoratorB::Operation()
    {
        AddedBehavior();
        Decorator::Operation();
    }
    void ConcreteDecoratorB::AddedBehavior()
    {
        cout<<"This is added behavior B."<<endl;
    }


    //////////////////////////////////////////////////////////////////////////
    void DecoratorPattern_Test()
    {
        Component *pComponentObj = new ConcreteComponent();
        Decorator *pDecoratorAOjb = new ConcreteDecoratorA(pComponentObj);
        pDecoratorAOjb->Operation();
        cout<<"============================================="<<endl;
        Decorator *pDecoratorBOjb = new ConcreteDecoratorB(pComponentObj);
        pDecoratorBOjb->Operation();
        cout<<"============================================="<<endl;
        Decorator *pDecoratorBAOjb = new ConcreteDecoratorB(pDecoratorAOjb);
        pDecoratorBAOjb->Operation();
        cout<<"============================================="<<endl;

        delete pDecoratorBAOjb;
        pDecoratorBAOjb = NULL;
        delete pDecoratorBOjb;
        pDecoratorBOjb = NULL;
        delete pDecoratorAOjb;
        pDecoratorAOjb = NULL;
        delete pComponentObj;
        pComponentObj = NULL;
    }
}


客户端
#include "DecoratorPattern.h"


#include <iostream>
using namespace std;
using namespace DecoratorPattern;

void main()
{
    DecoratorPattern_Test();
}

运行结果
分享到:
评论

相关推荐

    [结构型模式] head first 设计模式之装饰者模式(decorator)

    装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这个模式的名字来源于装饰艺术,它通过添加额外的装饰来增强一个物体的外观,同样地,...

    设计模式之结构型模式

    在本文中,我们将深入探讨结构型设计模式,特别是桥接模式、适配器模式、装饰者模式和组合模式,以及它们在实际场景中的应用。 1. **桥接模式**: 桥接模式将抽象部分与实现部分分离,使得它们可以独立进行变化。...

    设计模式--装饰者模式java例子

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来实现,它提供了一种比继承更灵活的方式来扩展对象的功能。...

    23种设计模式,创建型模式共5种,结构型模式7种,行为型模式11种

    设计模式分为三大类:创建型模式、结构型模式和行为型模式。 **创建型模式**关注的是对象的创建。共有五种创建型模式: 1. **工厂方法模式**:它定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法...

    设计模式之结构型模式uml类图EA文件.rar

    在给定的压缩包文件中,我们关注的是结构型设计模式,这些模式主要用于处理类和对象的组合与结构,以实现更灵活、可扩展的设计。下面我们将详细探讨其中涉及到的几个模式:桥接模式、适配器模式、装饰者模式和组合...

    Java设计模式之结构型模式源码以及文档

    结构型模式可以分为七种:适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。这些模式在不同的场景下有着各自的用途,它们可以帮助我们构建出灵活、可扩展的系统。 适配器模式允许两个不...

    装饰者模式Demo

    这种模式是结构型模式的一种,通过将对象包装在一个装饰器对象中来实现扩展功能,使得原有对象的功能得以增强,同时保持了对原有对象的接口一致性。 在Java编程语言中,装饰者模式通常使用继承来实现,但与简单的...

    设计模式 - 装饰者模式.rar

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象本身。这种模式的核心思想是通过将对象包装在一个装饰类中来扩展功能,而不是通过继承。以下是对装饰者模式的详细阐述: ...

    行为型模式+结构型模式+创建型模式:三大设计模式实例剖析与深入解读

    虽然描述中没有具体提及结构型模式的实例,但常见的结构型模式有代理模式、装饰器模式、桥接模式等,它们都在不同的场景下帮助我们构建更灵活、可扩展的系统。 **创建型模式**主要处理对象的创建。这些模式提供了一...

    装饰者模式Android实例

    装饰者模式是设计模式的一种,属于结构型模式,它的主要目的是动态地给对象添加新的行为或职责,而无需改变对象的原始代码。在Android开发中,装饰者模式的应用相当广泛,尤其是在视图组件的扩展和功能增强上。下面...

    设计模式-装饰者模式

    这种模式是结构型模式的一种,它遵循开闭原则,即对扩展开放,对修改关闭。在“设计模式—装饰者模式”中,我们将深入探讨这个模式的概念、实现方式以及实际应用。 装饰者模式的核心概念在于“装饰”(Decorator)...

    设计模式 装饰者模式

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这种模式是通过将对象包装在一个装饰器类中来实现的,装饰器类拥有与被装饰对象相同的接口,使得客户端代码可以...

Global site tag (gtag.js) - Google Analytics