zoukankan      html  css  js  c++  java
  • 结构型模式之 装饰模式

    装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。其别名也可以称为包装器(Wrapper),与适配器模式的别名相同,但它们适用于不同的场合。根据翻译的不同,装饰模式也有人称之为“油漆工模式”,它是一种对象结构型模式。

    一般有两种方式可以实现给一个类或对象增加行为:

    • 继承机制,使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的,用户不能控制增加行为的方式和时机。
    • 关联机制,即将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为以便扩展自己的行为,我们称这个嵌入的对象为装饰器(Decorator)

    装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。这就是装饰模式的模式动机。

    模式分析:

    • 与继承关系相比,关联关系的主要优势在于不会破坏类的封装性,而且继承是一种耦合度较大的静态关系,无法在程序运行时动态扩展。在软件开发阶段,关联关系虽然不会比继承关系减少编码量,但是到了软件维护阶段,由于关联关系使系统具有较好的松耦合性,因此使得系统更加容易维护。当然,关联关系的缺点是比继承关系要创建更多的对象。
    • 使用装饰模式来实现扩展比继承更加灵活,它以对客户透明的方式动态地给一个对象附加更多的责任。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。

    例子同样来自菜鸟教程

    我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。然后我们创建一个实现了 Shape 接口的抽象装饰类 ShapeDecorator,并把 Shape 对象作为它的实例变量。

    RedShapeDecorator 是实现了 ShapeDecorator 的实体类。

    DecoratorPatternDemo,我们的演示类使用 RedShapeDecorator 来装饰 Shape 对象。

    //步骤一 创建一个接口
    class Shape 
    {
    public:
        virtual void draw() {}
    };
    //步骤二 创建实现接口的实体类
    class Rectangle: public Shape
    {
    public:
        void draw()
        {
            std::cout << "Shape: Rectangle" << std::endl;
        }
    };
    
    class Circle : public Shape
    {
    public:
        void draw()
        {
            std::cout << "Shape: Circle" << std::endl;
        }
    };
    
    //步骤 3    创建实现了 Shape 接口的抽象装饰类
    class ShapeDecorator : public Shape
    {
    public:
        Shape* decoratedShape;
    public:
        ShapeDecorator() { decoratedShape = NULL; }
        ShapeDecorator(Shape * decoratorshape)
        {
            decoratedShape = decoratorshape;
            //decoratorshape->draw();
        }
        void draw() 
        {
            decoratedShape->draw();
        }
    };
    
    //步骤 4创建扩展了 ShapeDecorator 类的实体装饰类
    class RedShapDecort : public ShapeDecorator
    {
    public:
        //RedShapDecort(Shape* decortShape) :ShapeDecorator(decortShape) {}
        RedShapDecort() {}
        RedShapDecort(Shape* decortShape)
        {
            decoratedShape = decortShape;
        }
        void draw() 
        {
            decoratedShape->draw();
            setRedBorder(decoratedShape);
        }
    private:
        void setRedBorder(Shape* s1)
        {
            cout << "Border color :Red " << endl;
        }
    };
    
    int main() 
    {
        Circle circle;
        Shape * shape1 = &circle;
        shape1->draw();
    
        RedShapDecort s1(&circle);
        Shape * redCircle = &s1;
        redCircle->draw();
    
        Rectangle rect;
        RedShapDecort s2(&rect);
        Shape* Rect = &s2;
        Rect->draw();
    
        return 0;
    }
  • 相关阅读:
    Java+7入门经典 -1 简介
    优化算法动画演示Alec Radford's animations for optimization algorithms
    如何写科技论文How to write a technical paper
    开始学习深度学习和循环神经网络Some starting points for deep learning and RNNs
    用500行Julia代码开始深度学习之旅 Beginning deep learning with 500 lines of Julia
    用10张图来看机器学习Machine learning in 10 pictures
    ICLR 2013 International Conference on Learning Representations深度学习论文papers
    ICLR 2014 International Conference on Learning Representations深度学习论文papers
    卷积神经网络CNN(Convolutional Neural Networks)没有原理只有实现
    卷积神经网络Convolutional Neural Networks
  • 原文地址:https://www.cnblogs.com/gardenofhu/p/8504443.html
Copyright © 2011-2022 走看看