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


好了该篇就到这。  

相关文章
|
20天前
|
Java Spring
springboot切面logdemo
`LogAspect` 类为一个 Spring AOP 切面,用于日志记录。它拦截 `com.mryan.aop_mylog.controller` 包下的所有方法调用。方法入参和出参信息会被记录,异常情况也会被捕获并处理。代码使用了 `@Around` 注解进行环绕通知,并通过 ` ProceedingJoinPoint` 获取方法信息。日志通过 `Logger.getLogger(LogAspect.class)` 进行输出。
21 6
|
9天前
|
设计模式 Java API
谈谈springboot的 建造者模式
【4月更文挑战第17天】建造者模式是一种创建型设计模式,它将复杂对象的创建过程分解成多个简单的步骤,从而使得对象的创建过程更加灵活和可控。在Spring Boot应用中,建造者模式常被用于构建复杂的对象或配置信息,例如数据源、HTTP客户端或其他需要大量配置的组件。
24 1
|
12天前
|
缓存 安全 Java
谈谈springboot的装饰者模式
【4月更文挑战第14天】在 Spring Boot 中,装饰者模式被广泛应用于增强和扩展现有功能,同时保持核心逻辑的清晰和不变。这种模式在处理请求、响应、以及各种中间件中尤为常见,通过包装一个或多个组件来增加额外的行为或修改现有行为
14 2
|
11天前
|
设计模式 算法 Java
谈谈springboot的模板方法模式
【4月更文挑战第15天】模板方法模式是一种在软件工程中广泛使用的设计模式,它定义了一个操作中的骨架,将某些步骤延迟到子类中实现。这样可以在不改变算法结构的情况下重新定义算法的某些特定步骤。Spring Boot利用这种模式提供了一种非常灵活的方式来扩展和定制标准功能。
26 2
|
13天前
|
设计模式 Java 开发者
谈谈springboot的工厂模式
【4月更文挑战第13天】Spring Boot中的工厂模式是一种用于解耦组件创建过程的设计模式,它允许系统在运行时根据需要动态地创建不同类型的对象。这种模式在Spring框架中得到了广泛的应用,特别是在依赖注入(DI)和控制反转(IoC)的上下文中,它有助于管理复杂的依赖关系并提高代码的可维护性和可扩展性
135 7
|
13天前
|
设计模式 安全 Java
谈谈springboot的代理模式
【4月更文挑战第13天】在Spring Boot和Spring框架中,代理模式是一个核心的设计模式,被广泛用于实现面向切面编程(AOP)的功能。这种模式允许Spring通过代理对象来增强目标对象的行为,比如添加事务管理、安全控制、日志记录等功能,而不需要修改目标对象的代码
169 5
|
12天前
|
设计模式 算法 Java
谈谈springboot的策略模式
【4月更文挑战第14天】Spring Boot 中的策略模式主要通过接口和多个实现类来实现,这种设计允许在运行时动态选择算法或行为的具体实现。这是一种非常灵活的设计模式,可以帮助解耦组件之间的关系,使得系统更加灵活并易于扩展和维护。
27 2
|
8月前
|
Java 开发者 Spring
springboot依赖注入的几种方式
springboot依赖注入的几种方式
209 0
|
9月前
|
Java 开发者 Spring
SpringBoot自动装配的原理
Spring Boot 的自动装配(Auto-Configuration)是其核心特性之一,它通过约定优于配置的原则,为开发者简化了项目的配置和部署过程。
63 0
|
SQL XML Java
简单理解springboot的依赖注入
依赖注入,Dependency Injection,简称DI,是spring中的核心技术,此技术贯穿Spring全局,是必须要熟练掌握的知识点。在本文中,我们将要深入研究spring中的IOC和DI,理解核心思想,并学会如何在spring boot中使用基于java和注解的方式正确使用DI来创建spring应用程序。控制反转 IOC要理解DI,首先需要理解spring的核心思想之一,控制反转(In
1477 0
简单理解springboot的依赖注入