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

  • 相关阅读:
    SpringBoot自动配置原理(七)
    SpringBoot 集成Shiro
    Shiro配置跳过权限验证
    rsync+ssh同步备份文件
    okhttp3设置代理(http/https)
    Spring RestTemplete支持Https安全请求
    电商课题V:分布式锁
    电商课题:对付秒杀器等恶意访问行为的简单梳理
    电商课题:客户端的IP地址伪造、CDN、反向代理、获取的那些事儿
    电商课题I:集群环境下业务限流
  • 原文地址:https://www.cnblogs.com/94julia/p/3092250.html
Copyright © 2011-2022 走看看