1、什么是装饰模式
    在不改变原有对象的基础上附加功能,相比生成子类更灵活。
    2、装饰者模式的应用场景
    动态的给一对象添加或撤销功能
    3、装饰者模式的优缺点
    优点:可以在不改变原有对象的基础上扩展功能,可以扩展多个功能按照想要的顺序去执行,以实现不同的效果。
    缺点:更多的类,使程序复杂。
    4、装饰者模式类图
    5、装饰者模式定义
    抽象组件:定义一个抽象接口,来规范被附加功能的类;
    具体组件:将要被附加功能的类,实现抽象构建接口;
    抽象装饰者:持有对具体构件角色的引用并定义与抽象构件角色一知的接口;
    具体装饰:实现抽象装饰者角色,负责对具体构件添加额外功能。
    6、装饰者代码实现:
    定义一个抽象接口

    1. public abstract class GatewayComponent {
    2. public abstract void service();
    3. }

    定义被修饰角色

    1. public class BasicComponentGateway extends GatewayComponent {
    2. public void service() {
    3. System.out.println("网关开始获取基本参数信息");
    4. }
    5. }

    定义抽象装饰者角色:

    1. public abstract class AbstractDecorator extends GatewayComponent {
    2. protected GatewayComponent componentGateway;
    3. public AbstractDecorator() {
    4. }
    5. public AbstractDecorator(GatewayComponent componentGateway) {
    6. this.componentGateway = componentGateway;
    7. }
    8. public void service() {
    9. componentGateway.service();
    10. }
    11. public void setComponentGateway(GatewayComponent componentGateway) {
    12. if (componentGateway != null)
    13. this.componentGateway = componentGateway;
    14. }
    15. }

    定义具体装饰者角色:

    1. public class LimitDecorator extends AbstractDecorator {
    2. public LimitDecorator() {
    3. }
    4. public LimitDecorator(GatewayComponent componentGateway) {
    5. super(componentGateway);
    6. }
    7. @Override
    8. public void service() {
    9. // 1.传递日志收集装饰类
    10. System.out.println(super.getClass().toString());
    11. super.service();
    12. System.out.println("第三步>>>>API接口限流");
    13. }
    14. }
    15. public class LogDecorator extends AbstractDecorator {
    16. public LogDecorator() {
    17. }
    18. public LogDecorator(GatewayComponent componentGateway) {
    19. super(componentGateway);
    20. }
    21. @Override
    22. public void service() {
    23. // 调用装饰类service
    24. super.service();
    25. // 日志收集
    26. System.out.println("第二步>>>>日志的采集.....");
    27. }
    28. }

    如何调用:

    1. public class FactoryGateway {
    2. // public static GatewayComponent getGatewayComponent() {
    3. // // 1.创建日志装饰类
    4. // LogDecorator logDecorator = new LogDecorator();
    5. // LimitDecorator limitDecorator = new LimitDecorator();
    6. // limitDecorator.setGatewayComponent(logDecorator);
    7. // // 2.创建被装饰实现类
    8. // BasicComponentGateway basicComponentGateway = new BasicComponentGateway();
    9. // logDecorator.setGatewayComponent(basicComponentGateway);
    10. // return limitDecorator;
    11. // }
    12. public static GatewayComponent getGatewayComponent() {
    13. return new LimitDecorator(new LogDecorator(new BasicComponentGateway()));
    14. }
    15. public static void main(String[] args) {
    16. GatewayComponent gatewayComponent = FactoryGateway.getGatewayComponent();
    17. gatewayComponent.service();
    18. }
    19. }