设计模式之装饰者设计模式

1.什么是装饰者模式

在不改变原有对象的基础上附加功能,相比生成子类更灵活。

2.装饰者模式应用场景

动态的给一个对象添加或者撤销功能。

3.装饰者模式优缺点

优点:可以不改变原有对象的情况下动态扩展功能,可以使扩展的多个功能按想要的顺序执行,以实现不同效果。

缺点:更多的类,使程序复杂

4.装饰者模式类图

设计模式之装饰者设计模式_第1张图片

5.装饰者模式定义

(1)抽象组件:定义一个抽象接口,来规范准备附加功能的类

(2)具体组件:将要被附加功能的类,实现抽象构件角色接口

(3)抽象装饰者:持有对具体构件角色的引用并定义与抽象构件角色一致的接口

(4)具体装饰:实现抽象装饰者角色,负责对具体构件添加额外功能。

protected ComponentGateway componentGateway;

setComponentGateway(ComponentGateway componentGateway)

6.装饰者代码实现

6.1定义一个抽象的接口

public abstract class AbstractGatewayComponent {
    /**
     * 系统网关统一入口
     */
    public abstract void service();
}

6.2定义被装饰角色

@Component
public class BasicGatewayComponent extends AbstractGatewayComponent {

    @Override
    public void service() {
        System.out.println("1 first get request and response");
    }
}

6.3定义抽象装饰角色

@Component
public abstract class AbstractDecorator extends AbstractGatewayComponent {
    protected AbstractGatewayComponent gatewayComponent;
    @Override
    public void service() {
        gatewayComponent.service();
    }
    public AbstractDecorator(AbstractGatewayComponent gatewayComponent) {
        this.gatewayComponent = gatewayComponent;
    }
    public AbstractDecorator() {
    }
    /**
     * 设置执行装饰者
     *
     * @param gatewayComponent
     */
    public void setGatewayComponent(AbstractGatewayComponent gatewayComponent) {
        if (null != gatewayComponent) {
            this.gatewayComponent = gatewayComponent;
        }
    }
}

6.4定义具体装饰角色

6.4.1LimitDecorator限流操作类

@Component
public class LimitDecorator extends AbstractDecorator {
    public LimitDecorator() {
    }
    public LimitDecorator(AbstractGatewayComponent gatewayComponent) {
        super(gatewayComponent);
    }
    @Override
    public void service() {
        super.service();
        System.out.println("3执行限流操作");
    }
}

6.4.2LogDecorator日志操作类

@Component
public class LogDecorator extends AbstractDecorator {
    public LogDecorator(AbstractGatewayComponent gatewayComponent) {
        super(gatewayComponent);
    }
    public LogDecorator() {
    }
    @Override
    public void service() {
        super.service();
        System.out.println("2统一网关日志打印");
    }
}

6.5装饰者工厂

public class DecoratorFactory {

    /**
     * 通过工厂设置装饰者执行流程,装饰者都是通过最后需要执行的装饰者向上查询需要执行的类
     *
     * @return
     */
    public static AbstractGatewayComponent getGatewayComponent() {
 /*       LimitDecorator limitDecorator = new LimitDecorator();
        LogDecorator logDecorator = new LogDecorator();
        limitDecorator.setGatewayComponent(logDecorator);
        BasicGatewayComponent basicGatewayComponent = new BasicGatewayComponent();
        logDecorator.setGatewayComponent(basicGatewayComponent);
        return limitDecorator;*/
        return new LimitDecorator(new LogDecorator(new BasicGatewayComponent()));
    }

    public static void main(String[] args) {
        AbstractGatewayComponent gatewayComponent = DecoratorFactory.getGatewayComponent();
        gatewayComponent.service();
    }
}

7.源码角度分析装饰者模式

Java I/O 中的装饰者模式

Spring Session 中的装饰者模式

Mybatis 缓存中的装饰者模式

new FileInputStream(new File())

7.1Java I/O 中的装饰者模式

它基于字符流(InputStream/OutputStream) 和 字节流(Reader/Writer)作为基类,下面画出InputStream、Reader的

抽象构造角色   Reader

FilterReader  抽象的装饰类

设计模式之装饰者设计模式_第2张图片

8.责任链与装饰模式区别

8.1责任链实现原理

  每个被调用者 都持有下一个 被调用者 的引用,客户端只需要发起一次调用即可。 

  通过指向下一个handler的方法,顺序依据链表的形式执行,责任链是顺序执行的,指向下一个节点

  应用场景:过滤器、网关权限控制、p2p风控审批

8.2装饰的实现原理

持有被装饰的对象,并具备  被装饰者  的行为,对其行为进行补充增强

通过super执行具体的被装饰类,在反向从装饰类开始执行。反向流程

应用场景:io流、mybatis源码缓存

你可能感兴趣的:(程序员)