装饰器模式 : Decorator

声明 : 允许向一个现有的对象添加新的功能,同时又不改变其结构;通过对客户端透明的方式来扩展对象的功能,是继承关系的一种替换方案。

抽象组件(Component)  :  一个抽象接口,是 被装饰者(即具体的抽象组件,ConcreteComponent)和 装饰者(即抽象的装饰器,Decorator)的父接口。

具体的抽象组件(ConcreteComponent) : 为抽象组件的基本实现类。

抽象的装饰器(Decorator) : 包含一个抽象组件的引用。

具体的装饰器(ConcreteDecorator) : 抽象的装饰者的具体实现, 负责实现装饰。

基本写法如下 : 

1 . 抽象组件(Component)  : 

package name.ealen.decorator.designPattern;

/**
 * Created by EalenXie on 2018/10/29 17:42.
 */
public interface Component {

    void operation();
}

 

2 . 具体的抽象组件(ConcreteComponent) : 

package name.ealen.decorator.designPattern;

/**
 * Created by EalenXie on 2018/10/29 17:43.
 */
public class ConcreteComponent implements Component {
    @Override
    public void operation() {
        System.out.println("基本操作");
    }
}

 

3 . 抽象的装饰器(Decorator) : 

package name.ealen.decorator.designPattern;

/**
 * Created by EalenXie on 2018/10/29 17:44.
 */
public abstract class Decorator implements Component {

    protected Component component;

    public Decorator(Component component) {
        this.component = component;
    }
}

 

4 . 具体的装饰器(ConcreteDecorator)  : 

package name.ealen.decorator.designPattern;

/**
 * Created by EalenXie on 2018/10/29 17:48.
 */
public class ConcreteDecorator extends Decorator {

    private String name;

    public ConcreteDecorator(Component component, String name) {
        super(component);
        this.name = name;
    }

    @Override
    public void operation() {

        //原有component的操作
        super.component.operation();

        //扩展的操作
        System.out.println("扩展的 " + name + " 操作");
    }
}

 

5 . 进行测试,可以看到基本的装饰过程。

package name.ealen.decorator;

import name.ealen.decorator.designPattern.*;
import org.junit.Test;

/**
 * Created by EalenXie on 2018/10/29 17:31.
 */
public class DecoratorMain {


    /**
     * 标准实现
     */
    @Test
    public void designPattern() {

        Component component = new ConcreteComponent();

        Decorator a = new ConcreteDecorator(component, "A");   //一次装饰

        Decorator b = new ConcreteDecorator(a, "B");           //二次装饰(在一次装饰的基础上)

        Decorator c = new ConcreteDecorator(b, "C");           //三次装饰(在二次装饰的基础上)

        c.operation();

    }
}

 

6 . 可以看到控制台打印每一次的装饰处理,原本的组件只具有基本操作,在不修改它本身的前提下,逐渐装饰的过程中扩展了它的功能 : 

    

以上是装饰器模式的基本内容,代码地址可详见 : https://github.com/EalenXie/DesignPatterns/tree/master/src/name/ealen/decorator

版权声明:本文为ealenxie原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ealenxie/p/9873752.html