前言
本文配合實戰案例介紹我們平時 在springboot專案里面 怎么去用 裝飾器模式、多層裝飾怎么玩,
首先先說下裝飾器模式是什么
裝飾器模式(Decorator Pattern) 也稱為包裝模式(Wrapper Pattern) 是指在不改變原有物件的基礎之上,將功能附加到物件上,提供了比繼承更有彈性的替代方案(擴展原有物件的功能),屬于結構型模式,
官方:
裝飾器模式的核心是功能擴展,使用裝飾器模式可以透明且動態地擴展類的功能,
大白話一點:
有點像是 組合, 就是 我不動原先的業務東西,但是 又想給這個業務東西 加點額外的職責東西,
- 非入侵的,
- 可拼湊的,
實戰開搞
實體簡述預熱
ISurfTheInternetService 網上沖浪沖浪業務 介面 interface
FadInternetCafe implements ISurfTheInternetService時尚網咖 實作沖浪業務介面,實作重寫提供 網上沖浪方法RetroInternetBar implements ISurfTheInternetService復古網吧 實作沖浪業務介面,實作重寫提供 網上沖浪方法
然后在這個原有的沖浪業務下, 不做代碼入侵, 我們想給網上沖浪沖浪業務加一點額外的職責,比如XXX,XXX啥的xxx業務,
于是乎,我們開始玩裝飾器設計模式
SurfDecorator implements ISurfTheInternetService網上沖浪裝飾器
怎么玩的?看代碼, 后面還會說怎么多層裝飾 ,
Spring Boot 基礎就不介紹了,推薦看這個免費教程:
https://github.com/javastacks/spring-boot-best-practice
事不宜遲,
① 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();
}

可以看到效果,它裝起來了,又裝起來了:

來源:blog.csdn.net/qq_35387940/article/details/127464609
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2022最新版)
2.勁爆!Java 協程要來了,,,
3.Spring Boot 2.x 教程,太全了!
4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/545908.html
標籤:其他
上一篇:配置完maven環境變數后cmd輸入mvn -v命令后報錯:NB: JAVA_HOME should point to a JDK not a JRE
