ReplayingDecoder 解碼器:別以為我有多厲害,也只不過是使用了一下裝飾器模式而已~
阿新 • • 發佈:2020-08-24
#[原文地址](https://blog.csdn.net/Howinfun/article/details/108160762)
# 一、設計模式為啥老是用不好?
想要寫出更屌的程式碼,提高程式碼的健壯性和可擴充套件性,那麼設計模式可謂是必學的技能。
關於學習設計模式,大家可能都覺得設計模式的概念太過於抽象,理解起來有點費勁;又或者看的時候是理解了,但是寫起程式碼時,卻毫無頭緒,壓根不知道可以套用哪個設計模式。
對,可以看到我使用了 “套” 這個字眼,正是因為我們無法深入理解設計模式的設計理念和使用場景,所以我們往往是想讓我們的程式碼套用設計模式,而不理會業務場景是否合適。
關於設計模式的學習,我不會推薦任何書,因為我自己也沒看過,哈哈哈。我看過的是龍哥的設計模式系列文章,裡面的文章不但會介紹設計模式的概念,也會用非常有趣的場景去講解設計模式的設計理念,下面先分享一波連結:[龍哥設計模式全集](https://blog.csdn.net/zuoxiaolong8810/category_1434962.html)。
對於我自己而言,關於設計模式的使用,除非是非常深刻的理解了,又或者某種設計模式的使用場景非常的清晰明確(例如建立型設計模式中的單例模式、結構型設計模式中的組合模式、行為型設計模式中的策略模式等等),不然我也不知道該如何使用,和什麼時候使用。
# 二、在閱讀開源框架原始碼中學習設計模式!
**想學習設計模式的使用方式,何不研究一下各大優秀的開源框架的原始碼。**
想更深層次的理解設計模式,往往閱讀優秀的框架和中介軟體的原始碼是非常好的方式。優秀的開源框架和中介軟體,裡面都使用了大量的設計模式,使得框架的實用性、可擴充套件性和效能非常的高。
很巧,今天在工作的空餘時間中,我繼續閱讀一本關於併發的書,並看到關於 Netty 的內建解碼器,其中最常用的有 ReplayingDecoder,它是 ByteToMessageDecoder 的子類,作用是: 在讀取ByteBuf緩衝區的資料之前,需要檢查緩衝區是否有足夠的位元組;若ByteBuf中有足夠的位元組,則會正常讀取;反之,如果沒有足夠的位元組,則會停止解碼。
它是如何做到自主控制解碼的時機的呢?其實底層是使用了 ReplayingDecoderByteBuf 這個繼承於 ByteBuf 的實現類。而它使用了裝飾器設計模式。
## 1、在 Netty 中如何自定義實現整數解碼器?
### 1.1、ByteToMessageDecoder:
我們需要自定義類需要繼承 ByteToMessageDecoder 抽象類,然後重寫 decode 方法即可。
看程式碼:
```java
/**
* @author Howinfun
* @desc
* @date 2020/8/21
*/
public class MyIntegerDecoder extends ByteToMessageDecoder {
@Override
protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List