装饰模式-Decorator

 

名称:

    装饰模式(Decorator Pattern)-对象结构型模式

 

问题:

Wikipedia:

    The decorator pattern can be used to extend (decorate) the functionality of a certain object statically, or in some cases at run-time, independently of other instances of the same class, provided some groundwork is done at design time. This is achieved by designing a new decorator class that wraps the original class.

This pattern is designed so that multiple decorators can be stacked on top of each other, each time adding a new functionality to the overridden method(s).

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

 

适用性:

    -在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

    -处理那些可以撤销的职责。

    -当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

 

协作:

     Decorator将请求转发给它的Component对象,并有可能在转发请求前后执行一些附加的动作。

 

优点和缺点:

    1、比静态继承更灵活。

    2、避免在层次结构高层的类有太多的特征。

    3、Decorator与它的Component不一样。

    4、有许多小对象。

 

解决方案:

    

1、 模式的参与者

    1、Component

    -定义一个对象接口,可以给这些对象动态地添加职责。

    2、ConcreteComponent

    -定义一个对象,可以给这个对象添加一些职责。

   3、Decorator

    -维持一个指向Component对象的指针,并定义一个于Component接口一致的接口。

    4、ConcreteDecorator

    -向组件添加职责。

2.实现方式

    

interface  Component
{
    public void operation();
}
class ConcreteComponent implements Component
{   
    public void operation()
    {          
    }
}
class Decorator implements Component
{
    private Component component;   
    public Decorator(Component component)
    {
        this.component=component;
    }   
    public void operation()
    {
        component.operation();
    }
}
class ConcreteDecorator extends Decorator
{
    public ConcreteDecorator(Component component)
    {
        super(component);
    }   
    public void operation()
    {
        super.operation();
        decoratorFunction();
    }
    public void decoratorFunction()
    {
           
    }
}

 

public class DecoratorPattern
{
    public static void main(String[] args)
    {
        Component p=new ConcreteComponent();
        p.operation();
        
        Component d=new ConcreteDecorator(p);
        d.operation();
    }
}

 

装饰模式在java中的最著名的应用: Java I/O 标准库。

 

参考资料

《设计模式:可复用面向对象软件的基础》

posted @ 2020-06-25 17:24  diameter  阅读(161)  评论(0编辑  收藏  举报