← 每日面试题 学习看板

Netty 中用了哪些设计模式?

面试题/00java/04 框架/05Netty/Netty 中用了哪些设计模式?.md

面试记录 2026-10-27(Round 29)

题目:Netty 中用了哪些设计模式?

难度:difficulty/high

评分:⭐⭐☆☆☆(2/5)

我的回答

netty 中使用了很多设计模式,主要有单例模式、工厂模式、创建者模式、策略模式、责任链模式。

点评

优点:列出 5 个模式(单例/工厂/创建者/策略/责任链)。

不足:漏观察者模式(Promise/ChannelFuture 异步回调),且未讲每个模式的 Netty 具体体现(只报名字)。连续两次同类问题(2026-10-11 漏观察者,本次仍漏)。

补充:6 大件 = 单例/工厂/建造者/责任链/策略/观察者 + 装饰器(WrappedByteBuf)/适配器(ChannelHandlerAdapter);每提一个模式要能说"Netty 哪个类体现"。


面试记录 2026-10-11

题目:Netty 中用了哪些设计模式?

难度:difficulty/high

标签:spring/netty, difficulty/high

评分:⭐⭐☆☆☆(2/5)

我的回答

NGINX 首先使用的单例模式,它使用多个过滤器来处理过多的请求。另外它使用了责任链设计模式。还有工厂设计模式,创建 netty 对象的时候。

点评

优点:

不足:

补充:

完整讲解(权威版)

最后更新:2026-10-27 · 基于第 2 次作答

L1 · 30 秒速记

结论:Netty 常考 6 大件是单例/工厂/建造者/责任链/策略/观察者,每个要能对应 Netty 具体类。 关键词:ChannelPipeline 责任链 · Bootstrap 建造者 · ChannelFuture 观察者 边界:别背"6 大"清单,要能说"这个模式解决什么、Netty 怎么用的"。

L2 · 核心讲解

核心考点定位:考察能否把设计模式与 Netty 的实际实现类对应,而非只报模式名字。面试官想排除"报 5 个模式名但说不出 Netty 哪个类体现"的空泛回答。

机制链(≥3 环):

  1. 请求进入 Channel → 沿 Pipeline 传播:为什么——ChannelPipeline 是责任链,Inbound 向上、Outbound 向下,每个 Handler 决定是否传递
  2. 事件产生 → ChannelHandler 回调:为什么——观察者模式,EventLoop 驱动事件,解耦产生与处理
  3. 构建服务 → Bootstrap 链式配置:为什么——建造者模式,链式调用最后 build() 创建
  4. 异步 IO 完成 → ChannelFuture 通知:为什么——观察者,Promise/Future 承载结果,addListener 回调避免阻塞
  5. 传输选择 → NioSocketChannel/NioDatagramChannel:为什么——策略模式,运行时按需选 TCP/UDP

证据锚点(≥12):

对比与权衡:

模式Netty 体现解决的问题适用
责任链ChannelPipeline事件多级处理解耦协议栈处理
观察者ChannelFuture/Promise异步结果通知非阻塞回调
建造者Bootstrap复杂对象构建服务启动
策略Channel 传输/编解码运行时选实现TCP/UDP 切换
模板方法SimpleChannelInboundHandler固定流程+子类细节Handler 编写
装饰器WrappedByteBuf透明增强ByteBuf 包装

常见误区:

  1. 错误:把 Netty 说成 NGINX → 正确:Netty 是 Java NIO 框架 → 为什么:完全不同的框架,NGINX 是 C 语言 Web 服务器
  2. 错误:只报模式名 → 正确:说清 Netty 哪个类体现 → 为什么:报名字是敲门砖,对应类才是深度
  3. 错误:漏观察者 → 正确:ChannelFuture/Promise 是异步回调观察者 → 为什么:Netty 非阻塞核心靠它通知结果
  4. 错误:装饰器和适配器不算 → 正确:WrappedByteBuf 是装饰器,ChannelHandlerAdapter 是适配器 → 为什么:Netty 实际用了,属加分项
  5. 错误:Pipeline 是单向 → 正确:Pipeline 是双向责任链 → 为什么:Inbound 向上、Outbound 向下,与 Servlet Filter 单向不同

适用边界:设计模式不是越多越好,Netty 在恰当时机用恰当模式;面试重点在"模式解决什么问题 + Netty 哪里用了",不在背清单。单例在 Netty 里是"服务级复用"而非严格单例,别硬套;装饰器/适配器是加分项,但责任链/观察者才是 Netty 的灵魂,先说清这两个。

延伸追问(≥3)

  1. Netty 的 Pipeline 和 Servlet 的 FilterChain 有什么区别?
  1. Netty 的 EventLoop 模型和 Reactor 模型什么关系?
  1. Netty 如何扩展自定义 Handler?

面试者参考回答(500–800 字)

【结论】 面试官您好,Netty 是设计模式的应用典范,我按创建/结构/行为三类讲,每个都对应到具体类。

【三点】 第一,创建型——单例:EventLoopGroup 通常服务级复用一组;建造者:Bootstrap 链式配置最后 build();工厂:NioEventLoopGroup 创建 EventLoop。第二,结构型——责任链:ChannelPipeline 由多个 ChannelHandler 组成,Inbound 向上、Outbound 向下,支持动态增删;装饰器:WrappedByteBuf 透明包装;适配器:ChannelHandlerAdapter。第三,行为型——观察者:ChannelFuture/Promise 异步回调(addListener),非阻塞核心;策略:NioSocketChannel/NioDatagramChannel 运行时选传输;模板方法:SimpleChannelInboundHandler 定义 channelRead0 模板。

【边界】 当然,别背"6 大"固定清单——面试官更想看"这个模式解决什么、Netty 怎么用的",报名字只是敲门砖;Netty 与 NGINX 是两个完全不同的框架,别混淆。


作答历史

#日期评分本轮主要问题记录
12026-10-112/5误说 NGINX,漏观察者/策略/模板第 1 次
22026-10-272/5漏观察者,未讲模式对应类第 2 次