从Netty中学习设计模式

本文探讨了Netty中使用的设计模式,包括装饰者模式的WrappedByteBuf,它允许动态添加职责;责任链模式的ChannelPipeline,用于组织ChannelHandler并顺序处理请求;工厂模式的ReflectiveChannelFactory,帮助创建不同类型的Socket;建造者模式在WebSocketServerProtocolConfig.Builder的应用;以及单例模式、模板模式、观察者模式和策略模式的实例。这些模式在Netty中起到了关键作用,提高了代码的灵活性和可维护性。
摘要由CSDN通过智能技术生成

装饰者模式 -- WrappedByteBuf

描述:动态地给一个对象添加一些额外的职责。

出现原因:类的数量出现了爆炸式的增长。它可以帮我们的一些数据类型包装成Netty的ByteBuf,本身继承了ByteBuf, 它的构造函数是传入一个ByteBuf实例,这个传入的实例就是被装饰者,它的行为可以被当前这个类,也就是WrappedByteBuf(装饰者)动态改变。

https://blog.csdn.net/fst438060684/article/details/81156898

责任链模式 -- ChannelPipeline(ChannelHandler)

描述:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

ChannelPipeline源码注释也有解析清楚,ChannelPipeline负责按顺序组织各个ChannelHandler,ChannelHandlerContext作为handler上下文,handler的执行环境信息。

工厂模式 -- ReflectiveChannelFactory

描述:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。

ReflectiveChannelFactory可以帮助我们创建NIO Socket以及OIO Socket等等。

建造者模式 -- WebSocketServerProtocolConfig.Builder

描述:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的分离。

//TODO: 暂时没有找到的场景,源码4.1.12中WebSocketServerProtocolConfig未找到

单例模式 -- ReadTimeoutException#INSTANCE

描述:确保一个类只有一个实例,自行实例化并向整个系统提供这个实例。

按照checkName我们看到了ReadTimeoutException,它使用了单例避免频繁地创建我们的TimeoutException。

模板模式 -- AbstractTrafficShapingHandler

描述:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。

流量整形当中有三种流量整形方式,他们都复用了代码,但是又有一些区别,所以它用到一个AbstractTrafficShapingHandler。

netty流量整形参考:https://blog.csdn.net/u010939285/article/details/104303181

观察者模式 -- ChannelFuture#addListener

描述:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,这所有依赖于它的对象都会得到通知并被自动更新。

ChannelFuture通过addListener可以让我们添加不同的listener进去,当Future成功或者失败的时候会触发回调通知这些Listener,让Listener执行相应的方法。

策略模式 -- EventExecutorChooser

描述:定义一组算法,将每个​算法都封装起来,并且使它们之间可以互换。

EventExecutorChooser可以帮我们从NIOEventGroup当中选择一个EventLoop,根据初始化线程池的大小判断线程选择器是哪个,如果是2的幂次方数,则选用PowerOfTwoEventExecutorChooser运算(使用与运算更加高效);其他情况下则使用GenericEventExecutorChooser进行运算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值