Netty中的装饰者模式

简介: Netty中的装饰者模式

装饰者的应用#


所谓装饰者,说白了,目的就是对现有的对象进行增强,装饰者设计模式最大的优点就是,它在扩展类原有功能的基础上还避免的类爆炸的情况


Netty中的装饰者模式的应用#


ByteBuf是netty中重要的数据容器类,我们看它是如何设计的,如下图



我们可以看到,ByteBuf的直接实现类有五个,忽略WrappedByteBuf这个类,其实直接实现类有四个,为什么要忽略掉WrappedByteBuf呢? 因为是它是ByteBuf装饰者的基类; 它本身没有任何实现任何功能;


netty的设计者在设计ByteBuf的继承体系时,发现上图中的四个直接实现类可能都需要添加新的功能,这俩功能是

  • 不可释放的功能
  • 简单的泄漏感知的功能

怎么扩展这个功能呢?

如果选择继承的话,现有的四个类全部多出两个子类,让子类添加上特定的功能, 虽然解决了问题,但是类的数量出现了爆炸式的增长 从原来的4长到了 4+4*2

看上面的图,其实netty的设计者选择的处理模式是装饰者模式,只添加了三个类,就达到了同样的效果

装饰者的设计套路#

  • 添加一个装饰者顶级类,这个类和需要装饰的组件类在继承处于相等的地位
  • 这个装饰者类并不作任何的构工作,维护着ByteBuf的引用, 重写的ByteBuf的所有方法都是用这个引用完成具体的功能


源码如下:


*/
class WrappedByteBuf extends ByteBuf {
    protected final ByteBuf buf;
    protected WrappedByteBuf(ByteBuf buf) {
        if (buf == null) {
            throw new NullPointerException("buf");
        }
        this.buf = buf;
    }
    @Override
    public final boolean hasMemoryAddress() {
        return buf.hasMemoryAddress();
    }
    @Override
    public final long memoryAddress() {
        return buf.memoryAddress();
    }
...


  • 具体的装饰者,继承上面的装饰者的顶级类, 在自己的构造函数中接收ByteBuf的类型的参数,并把它传递给它的父类,用户在装饰者时,会把创建的最上面的四种待装饰的组件类以构造方法的形式传递进去,整个体系就运行起来了, 而且装饰者可以按照自己的需求重写父类的方法, 或者在现在的基础上添加新的方法调用进行增强


源码如下


*/
final class UnreleasableByteBuf extends WrappedByteBuf {
    private SwappedByteBuf swappedBuf;
    UnreleasableByteBuf(ByteBuf buf) {
        super(buf instanceof UnreleasableByteBuf ? buf.unwrap() : buf);
    }
    @Override
    public ByteBuf order(ByteOrder endianness) {
        if (endianness == null) {
            throw new NullPointerException("endianness");
        }
        if (endianness == order()) {
            return this;
        }
        SwappedByteBuf swappedBuf = this.swappedBuf;
        if (swappedBuf == null) {
            this.swappedBuf = swappedBuf = new SwappedByteBuf(this);
        }
        return swappedBuf;
    }
    @Override
    public ByteBuf asReadOnly() {
        return buf.isReadOnly() ? this : new UnreleasableByteBuf(buf.asReadOnly());
    }
...
相关文章
|
6月前
|
存储 缓存 监控
Netty基础篇:详解Netty底层NIO
Netty基础篇:详解Netty底层NIO
|
负载均衡 算法 Java
Netty源码分析系列之五:Netty多线程模型
本文主要介绍了Netty的多线程模型,它采用的是Reactor模型。处理连接请求与处理IO操作的线程隔离。基于事件轮询监听,不断获取处于就绪状态的通道。其中Boss线程池的线程负责处理连接请求,接收到accept事件之后,将对应的socket进行封装生成NioSocketChannel对象,并将其提交到workBoss线程池中,处理IO的read以及write事件。
Netty源码分析系列之五:Netty多线程模型
|
编解码 前端开发 Java
Netty实战(三)Netty的组件和设计
对于 Channel、EventLoop 和 ChannelFuture 类进行的讨论
124 0
|
监控 网络协议 Java
Netty源码分析之NIO
Socket是两台主机之间逻辑连接的端点。TCP/IP是传输层协议,定义数据如何在忘了中进行传输。HTTP是应用成协议,主要用来定义规范,包装数据,方便数据处理。Socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。
167 0
|
存储 Java API
03、Netty学习笔记—(Netty组件学习)(一)
03、Netty学习笔记—(Netty组件学习)(一)
03、Netty学习笔记—(Netty组件学习)(一)
|
消息中间件 分布式计算 前端开发
03、Netty学习笔记—(Netty组件学习)
03、Netty学习笔记—(Netty组件学习)
03、Netty学习笔记—(Netty组件学习)
|
分布式计算 网络协议 Java
Netty实现原理分析
Netty实现原理分析
258 0
Netty实现原理分析
|
数据处理
Netty原理:ChannelHandler
Netty原理:ChannelHandler
Netty原理:ChannelHandler
|
存储 前端开发
netty案例,netty4.1源码分析篇五《一行简单的writeAndFlush的都做了哪些事》
对于使用netty的小伙伴来说,ctx.writeAndFlush()再熟悉不过了,它可以将我们的消息发送出去。那么它都执行了那些行为呢,是怎么将消息发送出去的呢。
282 0
netty案例,netty4.1源码分析篇五《一行简单的writeAndFlush的都做了哪些事》
|
存储 算法 Java
netty系列之:netty中常用的对象编码解码器
我们在程序中除了使用常用的字符串进行数据传递之外,使用最多的还是JAVA对象。在JDK中,对象如果需要在网络中传输,必须实现Serializable接口,表示这个对象是可以被序列化的。这样就可以调用JDK自身的对象对象方法,进行对象的读写。 那么在netty中进行对象的传递可不可以直接使用JDK的对象序列化方法呢?如果不能的话,又应该怎么处理呢? 今天带大家来看看netty中提供的对象编码器。