前言

小飞棍来咯!

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

本篇内容:

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

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

好了该篇就到这。

Springboot 使用装饰器模式,快看,它装起来了相关推荐

  1. 设计模式学习(三)——装饰器模式

    前言 距离上一次正儿八经地写随笔已经有一段时间了,虽然2月10号有一篇关于泛型的小记,但是其实只是简单地将自己的学习代码贴上来,为了方便后续使用时查阅,并没有多少文字和理解感悟.之所以在今天觉得有必要 ...

  2. 设计模式之门面模式与装饰器模式详解和应用

    目录 1 门面模式定义 1.1 门面模式的应用场景 1.2 门面模式的通用写法 1.3 门面模式业务场景实例 1.4 门面模式在源码中的应用 1.5 门面模式的优缺点 2 装饰器模式 2.1 装饰器模 ...

  3. 设计模式之装饰器模式(Decorator Design Pattern)

    装饰器模式是八种结构型模式之一,通过一个装饰类来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 装饰器模式与代理模式非常像,区别是代理模式是原始功能上附加功能,而装饰器模式是增强原 ...

  4. 装饰器模式在MyBatis以及Spring源码中的应用

    结构型模式                 ----顺口溜:适装桥组享代外 目录 1.装饰器模式 1.1 装饰器模式UML图 1.2 日常生活中看装饰器模式 1.3 使用场景 1.4 Java代码实现 ...

  5. 3年工作必备 装饰器模式

    故事 古话说的好:人靠衣裳马靠鞍.下面先带大家来熟悉这句话的背景: 人靠衣装马靠鞍,狗配铃铛跑的欢出自沈自晋<望湖亭记>第十出:"虽然如此,佛靠金装,人靠衣装,打扮也是很要紧的. ...

  6. 漫画设计模式:什么是 “装饰器模式” ?

    作者 | 小灰 来源 | 程序员小灰(ID:chengxuyuanxiaohui) -----  第二天  ----- ------------ 装饰器模式都包含哪些核心角色呢? 1. Compone ...

  7. java设计模式之装饰器模式

    一.装饰器模式简介 装饰器模式可以动态给一个对象添加一些额外的职责,同时又不改变其结构.就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.这种模式创建了一个装饰 ...

  8. 装饰器模式与java.io包

    为什么80%的码农都做不了架构师?>>>    Decorator设计模式是典型的结构型模式(在GOF的那本模式的Bible中将模式分为:1.创建型模式:2.结构型模式:3.行为模式 ...

  9. (十)装饰器模式详解(与IO不解的情缘)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处. LZ到目前已经写了九个设计模式,回过去看看,貌似写的有点凌乱,LZ后面会尽量改进. 那么本章LZ和各位读友讨论一个与JAVA中IO有着 ...

最新文章

  1. 小贝_mysql 存储过程
  2. Java安全编码之用户输入
  3. 第六篇:python基础之文件处理
  4. jvm虚拟机 基于栈_守护基于JVM的应用程序
  5. Oracle adviser,Oracle10g SQL tune adviser
  6. *【CodeForces - 122D】Lucky Transformation(字符串问题,思维剪枝,优化,有坑,需注意的问题if的层次总结)
  7. ref绑定dom的三种写法
  8. QT中使用全局变量在多个源程序中传递变量
  9. 送你几款数据可视化大屏项目,科技感爆棚!!
  10. python encode和decode函数说明
  11. 二分查找(java)
  12. Swift - 将String类型的数字转换成数字类型
  13. kotlin使用mapstruct(二)
  14. matlab画站点降雨分布,matlab 怎样做整个中国各个气象站点上的温度变化趋势
  15. 信用报告中的个人基本信息如何更新?
  16. 20分钟让你了解OpenGL——OpenGL全流程详细解读
  17. 腾讯MSDK手Q微信授权登录
  18. cd短是什么意思,王者荣耀:是不是技能cd越短难度就越大?看她就明白了
  19. WirelessCar借助亚马逊云科技的安全服务,实现车端到云端的数据安全
  20. 13 【操作mysql数据库】

热门文章

  1. IPV6地址格式详解
  2. SDK实战(小米支付流程)
  3. 高中计算机基础 教案,高中计算机教案人教版(2)
  4. 数字后端基本概念介绍Net
  5. Windows 删除恢复分区
  6. 【C# / Algorithm】RGB、HSV、HSL颜色模型的互相转换
  7. phpexcel列数太多,【PHPEXECL】关于使用phpExecl导出数据时,列数超过26个报错问题
  8. 基于gensim的自然语言处理web服务器开发
  9. Postman 测试接口的软件程序
  10. linux 下的 service 和systemctl 服务管理方式