设计模式-装饰器模式
装饰器模式 : 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