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

news2025/1/13 14:16:35

前言

小飞棍来咯!

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


本篇内容:


就是配合实战案例介绍我们平时 在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();
    }

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

 

然后。

然后在这个原有的冲浪业务下, 不做代码入侵, 我们想给网上冲浪冲浪业务加一点额外的职责,比如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();
        
    }

 


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

 

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

 比如 时尚网卡的网上冲浪业务, 网咖老板比较腹黑,不仅仅需要做 A 增强业务, 
 
 还想看看每个来上网的人到底是不是有钱人,所以想检测一下卡里面的钱有多少,好安排一些‘优质服务’。
 
 
 
 ⑤ 又一层装饰器 RechargeDecorator.java  :
 
 
 ps : 它继承了基本的网上冲浪装饰器, 然后增强了自己的检测充值金额业务方法。
 
 

/**
 * @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();

    }


 
 

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

 

好了该篇就到这。 

 

 


 
 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python3,5行代码,制作Gif动图,太简单了。

gif动图制作1、引言2、代码实战2.1 安装2.2 代码3、总结1、引言 小屌丝:鱼哥, 你能不能帮我找一个动图, 小鱼:啥动图,你自己百度不就行了。 小屌丝:我这不是没找到吗, 不然我就自己来找了。 小…

Oracle数据库:net configureation assistant工具配置监听listener,配置本地网络访问服务器上的数据库

Oracle数据库:net configureation assistant工具配置监听listener,配置本地网络访问服务器上的数据库 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开…

图像类找工作面试题(二)——常见问题大总结

文章目录一、深度学习问题1、目标检测系列(1)介绍目标检测网络YOLO以及SSD系列原理。(2)YOLO对小目标检测效果不好的原因,怎么改善?(3)怎么防止过拟合(4)Drop…

Ubuntu18.04LTS环境下创建OpenCV4.x-Android库

1 背景 1.1 java.lang.UnsatisfiedLinkError: dlopen failed: library “libc_shared.so” not found libc_shared.so 之前默认集成在 opencv_java3.so,但是在OpenCV4.x以后,该动态库默认不集成在opencv_java4.so。 1.2 E/OpenCV/StaticHelper: OpenC…

NLP学习之:Bert 模型复现(1)任务分析 + 训练数据集构造

​ 文章目录代码资源原理学习任务代码讲解代码重写说明代码资源 Bert-pytorch 原理 学习任务 Bert 本质上是 Transformer 的 Encoder 端,Bert 在预训练时最基本的任务就是: 判断输入的两个句子是否真的相邻预测被 [MASK] 掉的单词 通过这两种任务的约…

面了个腾讯拿28k跳槽出来的,真正见识到了跳槽天花板

最近内卷严重,各种跳槽裁员,相信很多小伙伴也在准备金九银十的面试计划。 作为一个入职5年的老人家,目前工资比较乐观,但是我还是会选择跳槽,因为感觉在一个舒适圈待久了,人过得太过安逸,晋升涨…

ToDesk使用

现在的终端产品种类非常的多,常见的包括tablet, 手机,笔记本 ,ipod...等等,这些终端带屏产品连同台式机,智能电视等固定设备占据了我们的工作和生活中的大部分时间,不知道你发现没有,使这些不同种类的产品之…

[机器学习、Spark]Spark MLlib实现数据基本统计

👨‍🎓👨‍🎓博主:发量不足 📑📑本期更新内容:Spark MLlib基本统计 📑📑下篇文章预告:Spark MLlib的分类🔥🔥 简介&…

Java多线程【锁优化与死锁】

Java多线程【锁优化与死锁】🍒一.synchronized的优化🍎1.1基本特点🍎1.2加锁工作过程🍎1.3优化操作🍒二.死锁🍎2.1什么是死锁🍎2.2 一对一死锁🍎2.3 二对二死锁🍎2.4 N对…

Web 1.0、Web 2.0 和 Web 3.0 之间的比较

💂 个人网站:【海拥】【摸鱼小游戏】【神级源码资源网站】🤟 风趣幽默的前端学习课程:👉28个案例趣学前端💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】💬 免费且实用的 P…

目前最先进的神经网络算法,神经网络算法发展

1、神经网络的发展趋势如何? 神经网络的云集成模式还不是很成熟,应该有发展潜力,但神经网络有自己的硬伤,不知道能够达到怎样的效果,所以决策支持系统中并不是很热门,但是神经网络无视过程的优点也是无可替…

HTML5新特性

H5新增 1) 新增选择器 document.querySelector、document.querySelectorAll doucment.querySelector(#sampel) // 选择id doucment.querySelector(.sampel) // 选择出现的第一个类 doucment.querySelectorAll(.sampel)[0] // 选择出现的第一个类2)拖拽释放(Drag and drop) AP…

2022年江西省赣育杯网络安全大赛学生组WebMisc Writeup

文章目录WEB签到easyzphpezpyMISCbyteMuisc有趣的PDFWEB 签到 ?id-1union select 1,(select group_concat(schema_name) from information_schema.schemata),3,4,5--?id-1union select 1,(select group_concat(table_name) from information_schema.tables where table_sch…