设计模式专题 - 装饰模式

一. 概述

1. 什么是装饰模式?

 在不改变原有对象的基础上附加功能,相比生成子类更灵活(典型案例:打地基)

 装饰模式应用场景:在不改变原有对象的基础上附加功能,相比生成子类更灵活

 装饰模式优缺点:

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

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

2. 装饰模式名词定义

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

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

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

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

二. 代码实现

类图结构(核心思想:继承特性,supper关键字):

1. 定义抽象组件

package com.example.decorate;
public abstract class GatewayComponent {
    // 定义共同附加行为方法标准..
    public abstract void service();
}

2. 定义被装饰的类(地基)

package com.example.impl;
import com.example.decorate.GatewayComponent;
public class BasicComponentGateway extends GatewayComponent {
    public void service() {
        System.out.println("第一步>>> 网关中获取基本的操作...实现");
    }
}

3. 定义抽象的装饰类

package com.example.decorate;
public class AbstractDecorator extends GatewayComponent {
    public AbstractDecorator(GatewayComponent gatewayComponent) {
        this.gatewayComponent = gatewayComponent;
    }
    public GatewayComponent gatewayComponent;
    public void service() {
        if (gatewayComponent != null)
            gatewayComponent.service();
    }
}

4. 定义具体装饰类

① 日志收集

package com.example.impl;
import com.example.decorate.AbstractDecorator;
import com.example.decorate.GatewayComponent;
public class LogDecorator extends AbstractDecorator {
    public LogDecorator(GatewayComponent gatewayComponent) {
        super(gatewayComponent);
    }
    @Override
    public void service() {
        super.service();
        System.out.println("第二步>>> 网关中新增日志收集..");
    }
}

② API限流

package com.example.impl;
import com.example.decorate.AbstractDecorator;
import com.example.decorate.GatewayComponent;
public class LimitDecorator extends AbstractDecorator {
    public LimitDecorator(GatewayComponent gatewayComponent) {
        super(gatewayComponent);
    }
    @Override
    public void service() {
        super.service();
        System.out.println("第三步>>> 网关中新增API接口的限流..");
    }
}

5. 构建工厂,测试

package com.example.factory;
import com.example.decorate.GatewayComponent;
import com.example.impl.BasicComponentGateway;
import com.example.impl.LimitDecorator;
import com.example.impl.LogDecorator;
public class FactoryGateway {
    public static GatewayComponent getGatewayComponent() {
        return new LimitDecorator(new LogDecorator(new BasicComponentGateway()));
    }
    public static void main(String[] args) {
        GatewayComponent gatewayComponent = FactoryGateway.getGatewayComponent();
        gatewayComponent.service();
    }
}

执行main方法,可以看到控制台依次打印:

发布了45 篇原创文章 · 获赞 20 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/AkiraNicky/article/details/91355026