成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

米哈游一面:Netty 采用了哪些經(jīng)典的設(shè)計模式?

開發(fā)
本文我們詳細(xì)地分析了 Netty 包含的經(jīng)典設(shè)計模式,并結(jié)合 Netty 的具體實現(xiàn)來探討這些模式的應(yīng)用。

Netty 是一個優(yōu)秀的、高性能、異步的事件驅(qū)動網(wǎng)絡(luò)應(yīng)用框架,它內(nèi)部使用了許多經(jīng)典的設(shè)計模式。這篇文章,我們來詳細(xì)分析 Netty到底使用了哪些優(yōu)秀的設(shè)計模式,并且結(jié)合 Netty 的具體實現(xiàn)來探討這些模式的應(yīng)用。

1. 責(zé)任鏈模式

(1) 概念:

責(zé)任鏈模式(Chain of Responsibility)用于將請求沿著處理鏈傳播,每個對象都有機會處理請求或?qū)⑵鋫鬟f給下一個對象。

(2) Netty 中的應(yīng)用:

Netty 的 ChannelPipeline 和 ChannelHandler 正是責(zé)任鏈模式的經(jīng)典實現(xiàn)。ChannelPipeline 是一組互相連接的 ChannelHandler 對象,每個 ChannelHandler 執(zhí)行對數(shù)據(jù)流的處理。

(3) 實現(xiàn)案例:

  • 在 Netty 中,ChannelPipeline 提供了一組按順序工作的 ChannelHandler,可分為入站(inbound)和出站(outbound)。
  • 當(dāng)接收到數(shù)據(jù)時,它會沿入站處理鏈傳播,各個入站 ChannelHandler 依次處理該數(shù)據(jù)(如解碼、業(yè)務(wù)邏輯處理等)。
  • 當(dāng)發(fā)送數(shù)據(jù)時,它會沿出站處理鏈傳播,各個出站 ChannelHandler 依次處理該數(shù)據(jù)(如編碼、壓縮等)。

(4) 代碼示例:

ChannelPipeline pipeline = channel.pipeline();
pipeline.addLast(new DecoderHandler());
pipeline.addLast(new BusinessLogicHandler());
pipeline.addLast(new EncoderHandler());

每個處理器都會處理其關(guān)心的部分,并將其余的事情交給鏈內(nèi)的下一個處理器。

2. 觀察者模式

(1) 概念:

觀察者模式(Observer)定義了對象之間的一對多依賴關(guān)系,當(dāng)目標(biāo)對象狀態(tài)發(fā)生改變時,其依賴者(觀察者)會收到通知并自動更新。

(2) Netty 中的應(yīng)用:

Netty 的事件驅(qū)動模型通過觀察者模式實現(xiàn)。當(dāng) Selector 檢測到特定事件(如 read 或 write 準(zhǔn)備完成)后會通知對應(yīng)的 Channel。Channel 會觸發(fā)事件并將任務(wù)提交到合適的處理器執(zhí)行。

(3) 實現(xiàn)案例:

  • ChannelFuture 是 Netty 中觀察者模式的典型應(yīng)用,例如,當(dāng)你向服務(wù)器發(fā)送數(shù)據(jù)時,可以通過 ChannelFuture 注冊監(jiān)聽器,來監(jiān)控數(shù)據(jù)發(fā)送是否完成。
  • 當(dāng)操作完成時,監(jiān)聽器會被通知從而執(zhí)行用戶定義的回調(diào)邏輯。

(4) 代碼示例:

ChannelFuture future = channel.writeAndFlush(message);
future.addListener(new ChannelFutureListener() {
    @Override
    public void operationComplete(ChannelFuture future) throws Exception {
        if (future.isSuccess()) {
            System.out.println("Write successful!");
        } else {
            System.out.println("Write failed: " + future.cause());
        }
    }
});

ChannelFutureListener 是典型的觀察者,當(dāng) ChannelFuture 的狀態(tài)變化時會收到通知。

3. 工廠模式

(1) 概念:

工廠模式(Factory)用于創(chuàng)建對象的實例,屏蔽了對象創(chuàng)建的復(fù)雜性。

(2) Netty 中的應(yīng)用:

Netty 使用工廠模式隱藏了創(chuàng)建復(fù)雜對象的細(xì)節(jié),常見的是 EventLoopGroup 和 Bootstrap 等組件。

(3) 實現(xiàn)案例:

  • EventLoopGroup 是執(zhí)行事件循環(huán)的關(guān)鍵組件,Netty 提供了多種實現(xiàn)(如 NIO 的 NioEventLoopGroup 和 Epoll 的 EpollEventLoopGroup),用戶可以通過抽象工廠模式指定自己需要的實現(xiàn)。
  • Bootstrap 和 ServerBootstrap 也是工廠模式的經(jīng)典應(yīng)用,它們用于構(gòu)造客戶端和服務(wù)端配置。

(4) 代碼示例:

EventLoopGroup group = new NioEventLoopGroup();
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(group)
    .channel(NioSocketChannel.class)
    .handler(new ChannelInitializer<SocketChannel>() {
        @Override
        protected void initChannel(SocketChannel ch) throws Exception {
            ch.pipeline().addLast(new MyHandler());
        }
    });

用戶只需要調(diào)用 Bootstrap 的方法即可完成工廠的配置,隱藏了復(fù)雜的配置邏輯。

4. 適配器模式

(1) 概念:

適配器模式(Adapter)用來將一個類的接口轉(zhuǎn)換為另一個接口,以實現(xiàn)接口之間的兼容。

(2) Netty 中的應(yīng)用:

Netty 的 ChannelHandlerAdapter 和 ChannelInboundHandlerAdapter 是典型的適配器模式應(yīng)用,它們簡化了 ChannelHandler 的實現(xiàn)。

(3) 實現(xiàn)案例:

Netty 的 ChannelHandler 提供了很多接口方法,但用戶可能只需要實現(xiàn)一小部分邏輯。在這種情況下,用戶無需全部實現(xiàn)所有方法,可以繼承 ChannelInboundHandlerAdapter 或 ChannelOutboundHandlerAdapter 來簡化代碼。

(4) 代碼示例:

public class MyHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("Message received: " + msg);
        ctx.fireChannelRead(msg);
    }
}

通過適配器,用戶不需要實現(xiàn) ChannelHandler 的所有方法,同時保留了靈活性。

5. 策略模式

(1) 概念:

策略模式(Strategy)將一組算法封裝起來,使得它們可以互換,同時將算法的選擇獨立于使用這些算法的客戶。

(2) Netty 中的應(yīng)用:

Netty 在其 EventLoopGroup 和處理 IO 的任務(wù)分配中采用了策略模式。通過抽象的 EventLoop,Netty 支持多種不同的多路復(fù)用機制(如 NIO、Epoll 等)。

(3) 實現(xiàn)案例:

  • EventLoopGroup 支持多種實現(xiàn),并根據(jù)運行環(huán)境動態(tài)選擇策略,例如在 Linux 平臺優(yōu)先選擇 Epoll。
  • Netty 的序列化與解碼器也使用了策略模式,不同的序列化方式可以互相替換(如 protobuf、JSON 等)。

(4) 代碼示例:

EventLoopGroup group = new EpollEventLoopGroup(); // Linux 平臺下的高性能實現(xiàn)
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(group)
    .channel(EpollSocketChannel.class);

用戶可以靈活替換實現(xiàn)以適配特定需求。

6. 原型模式

(1) 概念:

原型模式 (Prototype)通過克隆的方式創(chuàng)建對象,而不是直接實例化。

(2) Netty 中的應(yīng)用:

Netty 的緩沖區(qū)分配(ByteBufAllocator)中使用了原型模式。為了減少內(nèi)存分配和回收的開銷,Netty 提供了池化的緩沖區(qū),通過克隆和回收來重復(fù)利用緩沖區(qū)。

(3) 實現(xiàn)案例:

  • PooledByteBufAllocator 負(fù)責(zé)提供緩沖區(qū),其內(nèi)部維護(hù)了一系列固定大小的內(nèi)存塊,用于內(nèi)存分配和回收。
  • 使用原型模式減少了頻繁的內(nèi)存分配成本。

7. 單例模式

(1) 概念:

單例模式(Singleton)保證一個類只存在一個實例,并提供全局訪問點。

(2) Netty 中的應(yīng)用:

Netty 中某些共享的組件采用單例模式,例如 Unpooled 類和一些內(nèi)部工具類。

(3) 實現(xiàn)案例:

Unpooled 是非池化緩沖區(qū)的工廠類,它使用單例模式提供緩沖區(qū)操作的統(tǒng)一入口。

(4) 代碼示例:

ByteBuf buf = Unpooled.buffer(256);

8. 模板方法模式

(1) 概念:

模板方法模式(Template Method)允許在基類定義操作的框架,而將具體實現(xiàn)延遲到子類。

(2) Netty 中的應(yīng)用:

Netty 的很多組件都提供了模板方法模式的實現(xiàn),例如 ChannelInitializer 用于設(shè)置 ChannelPipeline。

(3) 實現(xiàn)案例:

用戶通過繼承 ChannelInitializer 定義自己的邏輯,而底層框架負(fù)責(zé)調(diào)用和執(zhí)行。

(4) 代碼示例:

public class MyChannelInitializer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ch.pipeline().addLast(new MyHandler());
    }
}

9. 總結(jié)

這篇文章,我們詳細(xì)地分析了 Netty 包含的經(jīng)典設(shè)計模式,并結(jié)合 Netty 的具體實現(xiàn)來探討這些模式的應(yīng)用。因為篇幅有限,我們只分析了 8種有代表性的模型,但是 Netty的設(shè)計模式絕不僅僅只有這些,它們都是經(jīng)典的設(shè)計模式。作為Java領(lǐng)域一款經(jīng)典的網(wǎng)絡(luò)通信工具,Netty絕對值得我們花時間去琢磨。

責(zé)任編輯:趙寧寧 來源: 猿java
相關(guān)推薦

2022-05-10 08:11:15

MySQL技巧結(jié)構(gòu)

2022-05-11 15:57:16

優(yōu)化SQL

2025-05-15 09:45:54

2025-03-28 08:10:00

Spring自動裝配Java

2025-05-22 09:54:06

2022-04-02 10:52:33

Go開發(fā)面試

2022-05-11 22:15:51

云計算云平臺

2009-07-30 14:38:36

云計算

2020-09-19 17:46:20

React Hooks開發(fā)函數(shù)

2025-04-25 08:35:00

OAuth2權(quán)限驗證開發(fā)

2011-12-22 20:53:40

Android

2011-12-23 09:43:15

開源開放

2024-10-31 08:50:14

2024-05-15 16:41:57

進(jìn)程IO文件

2024-05-30 07:37:30

2019-10-31 13:58:32

阿里電商系統(tǒng)

2024-11-11 17:27:45

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧产日产国产精品视频 | 中文字幕一区在线观看视频 | 精品欧美一区免费观看α√ | 国产在线观看 | 欧美久久一区二区三区 | 手机日韩 | 亚洲精品欧美 | 一区二区三区日 | 99这里只有精品视频 | 黄色片在线 | 日本免费一区二区三区四区 | 亚洲国产精品成人久久久 | 国产色在线 | 国产专区免费 | 亚洲精品视频免费观看 | 天天躁日日躁狠狠很躁 | 婷婷久久综合 | 一级片毛片| 欧美日日 | 国内精品一区二区三区 | 欧美激情欧美激情在线五月 | 一区二区三区精品视频 | 日韩成人在线观看 | 日日骚av| 日韩手机在线视频 | 日本在线免费观看 | 一级在线免费观看 | 福利二区 | 精品国产欧美 | 永久精品 | 国产精品亚洲成在人线 | 亚洲成av人片在线观看 | 欧美一区二区三区在线看 | 91精品国产综合久久久久久蜜臀 | 亚洲一区二区三区在线播放 | 久久精品国产一区二区电影 | 99久久精品免费看国产四区 | 成人免费看片 | 在线观看免费观看在线91 | 国产精品成人一区二区 | 亚洲 中文 欧美 日韩 在线观看 |