Springboot 使用装饰器模式,快看,它装起来了
创始人
2024-01-12 22:12:01

前言

小飞棍来咯!

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


本篇内容:


就是配合实战案例介绍我们平时 在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 {@Overridepublic 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 {@Overridepublic 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;}/*** 增强的网上冲浪方法*/@Overridepublic 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);}@Overridepublic 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();}


 
 

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

 

好了该篇就到这。 

 

 


 
 

 

 

相关内容

热门资讯

demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...