Springboot 使用装饰器模式,快看,它装起来了

简介: Springboot 使用装饰器模式,快看,它装起来了

前言



小飞棍来咯!


本篇文章跟小飞棍一毛钱关系没有。


本篇内容:


就是配合实战案例介绍我们平时 在springboot项目里面 怎么去用 装饰器模式、多层装饰怎么玩。


正文



首先先说下装饰器模式是什么


官方:


装饰器模式(Decorator Pattern) 也称为包装模式(Wrapper Pattern) 是指在不改变原有对象的基础之上,

将功能附加到对象上,

提供了比继承更有弹性的替代方案(扩展原有对象的功能),

属于结构型模式。

装饰器模式的核心是功能扩展,使用装饰器模式可以透明且动态地扩展类的功能。


大白话一点:


有点像是 组合, 就是 我不动原先的业务东西,但是 又想给这个业务东西 加点额外的职责东西。

非入侵的。

可拼凑的。


实战开搞


实例简述预热


ISurfTheInternetService  网上冲浪冲浪业务 接口 interface


FadInternetCafe implements ISurfTheInternetService 时尚网咖 实现冲浪业务接口,实现重写提供 网上冲浪方法


RetroInternetBar implements ISurfTheInternetService 复古网吧  实现冲浪业务接口,实现重写提供 网上冲浪方法


然后在这个原有的冲浪业务下, 不做代码入侵, 我们想给网上冲浪冲浪业务加一点额外的职责,比如XXX,XXX啥的xxx业务。


于是乎,我们开始玩装饰器设计模式


SurfDecorator  implements  ISurfTheInternetService 网上冲浪装饰器


怎么玩的?  看代码, 后面还会说怎么多层装饰 。


事不宜迟。


①  ISurfTheInternetService.java   网上冲浪冲浪业务 接口


/**
 * @Author: JCccc
 * @Date: 2022-10-07 15:18
 * @Description: 网上冲浪
 */
public interface ISurfTheInternetService {
    /**
     * 冲起来
     */
    void doSurfing();
}

②  FadInternetCafe.java  时尚网咖业务实现类


import com.example.mydemo.service.ISurfTheInternetService;
import org.springframework.stereotype.Service;
/**
 * @Author: JCccc
 * @Date: 2022-10-07 15:21
 * @Description: 时尚 网咖
 */
@Service("fadInternetCafeService")
public class FadInternetCafe implements ISurfTheInternetService {
    @Override
    public void doSurfing() {
        System.out.println("在时尚 网咖 ,网上冲浪咯~");
    }
}


③  RetroInternetBar.java    复古网吧业务实现类


import com.example.mydemo.service.ISurfTheInternetService;
import org.springframework.stereotype.Service;
/**
 * @Author: JCccc
 * @Date: 2022-10-07 15:21
 * @Description: 复古 网吧
 */
@Service("retroInternetBarService")
public class RetroInternetBar implements ISurfTheInternetService {
    @Override
    public void doSurfing() {
        System.out.println("在复古 网吧 ,网上冲浪咯~");
    }
}


先到这, 写个controller方法,模拟平时搬砖真实场景 :


    @Autowired
    @Qualifier("fadInternetCafeService")
    ISurfTheInternetService fadInternetCafeService;
    @Autowired
    @Qualifier("retroInternetBarService")
    ISurfTheInternetService retroInternetBarService;
    @GetMapping("/doTest")
    public void doTest() {
        fadInternetCafeService.doSurfing();
        retroInternetBarService.doSurfing();
    }

可以看到调用效果是这样的:


image.png


然后。


然后在这个原有的冲浪业务下, 不做代码入侵, 我们想给网上冲浪冲浪业务加一点额外的职责,比如XXX,XXX啥的xxx业务。


④  SurfDecorator.java  网上冲浪装饰器


/**
 * @Author: JCccc
 * @Date: 2022-10-07 15:29
 * @Description:
 */
public class SurfDecorator implements  ISurfTheInternetService {
    /**
     * 内部维护一个冲浪接口类
     */
    private ISurfTheInternetService surfTheInternetService;
    /**
     * 构造方法 把传入的 类 赋值给内部类
     * @param surfTheInternetService
     */
    public SurfDecorator(ISurfTheInternetService surfTheInternetService) {
        this.surfTheInternetService = surfTheInternetService;
    }
    /**
     * 增强的网上冲浪方法
     */
    @Override
    public void doSurfing() {
        System.out.println("SurfDecorator 模拟业务 增强器在玩一点很新的东西,可能是一些额外的职责业务....");
        //增强
        surfTheInternetService.doSurfing();
        System.out.println("SurfDecorator 模拟业务 增强器在玩一点很新的东西,可能是一些额外的职责业务,比如说是XXXX");
    }
}


然后我们通过装饰器去 调用方法,实现增强职责:


    @GetMapping("/useDecoratorTest")
    public void useDecoratorTest() {
        SurfDecorator fadInternetCafeDecoratorService = new SurfDecorator(fadInternetCafeService);
        fadInternetCafeDecoratorService.doSurfing();
        SurfDecorator retroInternetBarDecoratorService = new SurfDecorator(retroInternetBarService);
        retroInternetBarDecoratorService.doSurfing();
    }

image.png


可以看到效果, 它装起来了 :


image.png


然后,如果我们想多层装饰, 也就是 ,针对不同也网上冲浪业务实现类,想装一层又一层,


比如 时尚网卡的网上冲浪业务, 网咖老板比较腹黑,不仅仅需要做 A 增强业务,

还想看看每个来上网的人到底是不是有钱人,所以想检测一下卡里面的钱有多少,好安排一些‘优质服务’。


⑤ 又一层装饰器 RechargeDecorator.java  :


/**
 * @Author: JCccc
 * @Date: 2022-10-07 15:29
 * @Description:
 */
public class RechargeDecorator extends SurfDecorator{
    public RechargeDecorator(ISurfTheInternetService surfTheInternetService) {
        super(surfTheInternetService);
    }
    @Override
    public void doSurfing() {
        super.doSurfing();
        checkRecharge();
    }
    private void checkRecharge(){
        System.out.print("RechargeDecorator 也在增强,看看这个货卡里面充了有多少,就来上网");
    }
}


然后看看 我们怎么玩 多层装饰:

    @GetMapping("/moreDecoratorTest")
    public void moreDecoratorTest() {
        //先装一哈
        SurfDecorator retroInternetBarDecoratorService = new SurfDecorator(retroInternetBarService);
        //再包装一哈
        RechargeDecorator rechargeDecorator = new RechargeDecorator(retroInternetBarDecoratorService);
        rechargeDecorator.doSurfing();
    }

image.png

可以看到效果,它装起来了,又装起来了:


image.png


好了该篇就到这。  

相关文章
|
设计模式 Java Spring
Spring Boot 实现装饰器模式,真香!
Spring Boot 实现装饰器模式,真香!
285 0
Spring Boot 实现装饰器模式,真香!
|
5月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
287 1
|
2月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的留守儿童爱心网站设计与实现(计算机毕设项目实战+源码+文档)
博主是一位全网粉丝超过100万的CSDN特邀作者、博客专家,专注于Java、Python、PHP等技术领域。提供SpringBoot、Vue、HTML、Uniapp、PHP、Python、NodeJS、爬虫、数据可视化等技术服务,涵盖免费选题、功能设计、开题报告、论文辅导、答辩PPT等。系统采用SpringBoot后端框架和Vue前端框架,确保高效开发与良好用户体验。所有代码由博主亲自开发,并提供全程录音录屏讲解服务,保障学习效果。欢迎点赞、收藏、关注、评论,获取更多精品案例源码。
82 10
|
2月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的家政服务管理平台设计与实现(计算机毕设项目实战+源码+文档)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
65 8
|
2月前
|
JavaScript 搜索推荐 Java
基于SpringBoot+Vue实现的家乡特色推荐系统设计与实现(源码+文档+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
84 8
|
2月前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的大学生就业服务平台设计与实现(系统源码+文档+数据库+部署等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
86 6
|
2月前
|
JavaScript Java 测试技术
基于Java+SpringBoot+Vue实现的车辆充电桩系统设计与实现(系统源码+文档+部署讲解等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
67 6
|
2月前
|
JavaScript NoSQL Java
基于SpringBoot+Vue的班级综合测评管理系统设计与实现(系统源码+文档+数据库+部署等)
✌免费选题、功能需求设计、任务书、开题报告、中期检查、程序功能实现、论文辅导、论文降重、答辩PPT辅导、会议视频一对一讲解代码等✌
57 4
|
2月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的高校食堂移动预约点餐系统设计与实现(源码+文档+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
78 3
|
2月前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的大学生体质测试管理系统设计与实现(系统源码+文档+数据库+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
48 2