zoukankan      html  css  js  c++  java
  • 装饰者模式(Decorator)

    装饰者模式(Decorator


     

    装饰者模式(Decorator[Wrapper]

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

    应用:给GUI组件添加功能等。

    模式结构

     

    心得

    装饰器(Decorator)和被装饰的对象(ConcreteComponent)拥有统一的接口,这个统一的接口正是被装饰对象需要扩展功能的地方,因此它们需要一个共同的接口(AbstractComponent)。另外为了完成装饰的目的,装饰器需要包含被装饰的对象,装饰器不直接包含被装饰对象,而是包含它们统一接口的引用,这样通过多态机制可以实现多层装饰。注意装饰器对抽象接口的关系是一对一的,这和组合模式很像,但是一对一的关系决定了装饰器一次只能装饰一个对象,这种关系正是我们想要的。装饰器为被装饰对象添加功能通过调用被装饰对象的统一接口实现,如果装饰器需要复杂的扩展,我们通过继承装饰器实现具体的装饰器(ConcreteDecorator),具体的装饰器可以扩展数据(addedState),也可以扩展接口功能(addedBehavior)。

    举例

    被装饰的对象假如是一块蛋糕,装饰器就是为蛋糕添加额外的属性,比如加上一朵花等。统一接口为了简单我们输出装饰后蛋糕的名字,那么装饰器的统一接口operation实现时就需要调用被装饰对象的operation,然后添加额外的名字。C++代码实现如下:

     
    class AbstractComponent
    {
    public:
        virtual string operation()=0;
        virtual ~AbstractComponent(){}
    };
    class ConcreteComponent:public AbstractComponent
    {
    public:
        virtual string operation()
        {
            return "基本对象";
        }
    };
    class Decorator:public AbstractComponent
    {
    protected:
        AbstractComponent*pAbsComponent;
    public:
        Decorator(AbstractComponent*pac):pAbsComponent(pac){}
        virtual~Decorator()
        {
            delete pAbsComponent;
        }
    };
    class ConcreteDecorator:public Decorator
    {
    public:
        ConcreteDecorator(AbstractComponent*pac):Decorator(pac){}
        virtual string operation()
        {
            string str="装饰后的";
            str+=pAbsComponent->operation();
            return str;
        }
    };
     

    用户使用起来代码如下:

     
    AbstractComponent*pac=
        new ConcreteDecorator(
            new ConcreteDecorator(
                new ConcreteComponent()
        ));
    cout<<pac->operation().c_str()<<endl;
    delete pac;
     

    从使用装饰者模式的代码来看,装饰器对对象的操作就像包装一样,一层层的为对象扩展功能,而且装饰器装饰后的对象仍然可以被装饰。

    来源:http://www.cnblogs.com/fanzhidongyzby/archive/2012/12/14/2818779.html

  • 相关阅读:
    angularjs的$on、$emit、$broadcast
    angularjs中的路由介绍详解 ui-route(转)
    ionic入门教程-ionic路由详解(state、route、resolve)(转)
    Cocos Creator 加载使用protobuf第三方库,因为加载顺序报错
    Cocos Creator 计时器错误 cc.Scheduler: Illegal target which doesn't have uuid or instanceId.
    Cocos Creator 构造函数传参警告 Can not instantiate CCClass 'Test' with arguments.
    Cocos Creator 对象池NodePool
    Cocos Creator 坐标系 (convertToWorldSpaceAR、convertToNodeSpaceAR)
    Cocos Creator 常驻节点addPersistRootNode
    Cocos Creator 配合Tiled地图的使用
  • 原文地址:https://www.cnblogs.com/94julia/p/3092250.html
Copyright © 2011-2022 走看看