netty中的设计模式
日期: 2020-11-26 分类: 跨站数据测试 350次阅读
设计模式在 Netty 中的应用
单例模式源码举例
单例模式要点回顾:
1、一个类在任何情况下只有一个对象,并提供一个全局访问点。
2、可延迟创建。
3、避免线程安全问题
案例分析
@Sharable public final class MqttEncoder extends MessageToMessageEncoder<MqttMessage> { public static final MqttEncoder INSTANCE = new MqttEncoder(); private MqttEncoder() { } protected void encode(ChannelHandlerContext ctx, MqttMessage msg, List<Object> out) throws Exception { out.add(doEncode(ctx.alloc(), msg)); }... }
策略模式源码举例
策略模式要点回顾:
1、封装一系列可相互替换的算法家族。
2、动态选择某一个策略。
案例分析:
public final class DefaultEventExecutorChooserFactory implements EventExecutorChooserFactory { public static final DefaultEventExecutorChooserFactory INSTANCE = new DefaultEventExecutorChooserFactory(); private DefaultEventExecutorChooserFactory() { } public EventExecutorChooser newChooser(EventExecutor[] executors) { return (EventExecutorChooser)(isPowerOfTwo(executors.length)?new DefaultEventExecutorChooserFactory.PowerOfTowEventExecutorChooser(executors):new DefaultEventExecutorChooserFactory.GenericEventExecutorChooser(executors)); } private static boolean isPowerOfTwo(int val) { return (val & -val) == val; } ... }
装饰者模式源码举例
装饰者模式要点回顾:
1、装饰者和被装饰者实现同一个接口。
2、装饰者通常继承被装饰者,同宗同源。
3、动态修改、重载被装饰者的方法
WrappedByteBuf :
class WrappedByteBuf extends ByteBuf { protected final ByteBuf buf; protected WrappedByteBuf(ByteBuf buf) { if(buf == null) { throw new NullPointerException("buf"); } else { this.buf = buf; } } ... }
UnreleasableByteBuf :
final class UnreleasableByteBuf extends WrappedByteBuf { private SwappedByteBuf swappedBuf; UnreleasableByteBuf(ByteBuf buf) { super(buf); } ... public boolean release() { return false; } public boolean release(int decrement) { return false;} }
SimpleakAwareByteBuf:
final class SimpleLeakAwareByteBuf extends WrappedByteBuf { private final ResourceLeak leak; SimpleLeakAwareByteBuf(ByteBuf buf, ResourceLeak leak) { super(buf); this.leak = leak; } ... public boolean release() { boolean deallocated = super.release(); if(deallocated) { this.leak.close(); } return deallocated; } public boolean release(int decrement) { boolean deallocated = super.release(decrement); if(deallocated) { this.leak.close(); } return deallocated; } }
观察者模式源码举例
观察者模式要点回顾:
1、两个角色:观察者和被观察者。
2、观察者订阅消息,被观察者发布消息。
3、订阅则能收到消息,取消订阅则收不到。
channel.writeAndFlush()方法:
AbstractChannel:
public abstract class AbstractChannel extends DefaultAttributeMap implements Channel { ... public ChannelFuture writeAndFlush(Object msg) { return this.pipeline.writeAndFlush(msg); } public ChannelFuture writeAndFlush(Object msg, ChannelPromise promise) { return this.pipeline.writeAndFlush(msg, promise); }
迭代器模式源码举例
迭代器模式要点回顾:
\1. 实现迭代器接口
\2. 实现对容器中的各个对象逐个访问的方法。
public class CompositeByteBuf extends AbstractReferenceCountedByteBuf implements Iterable<ByteBuf> { protected byte _getByte(int index) { CompositeByteBuf.Component c = this.findComponent(index); return c.buf.getByte(index - c.offset); } ... }
责任链模式源码举例
责任链:是指多个对象都有机会处理同一个请求,从而避免请求的发送者和接收者之间的耦合关系。然后,将这些对 象连成一条链,并且沿着这条链往下传递请求,直到有一个对象可以处理它为止。在每个对象处理过程中,每个对象 只处理它自己关心的那一部分,不相关的可以继续往下传递,直到链中的某个对象不想处理,可以将请求终止或丢弃。
责任链模式要点回顾:
1、需要有一个顶层责任处理接口(ChannelHandler)。
2、需要有动态创建链、添加和删除责任处理器的接口(ChannelPipeline)。
3、需要有上下文机制(ChannelHandlerContext)。
4、需要有责任终止机制(不调用 ctx.fireXXX()方法,则终止传播)
AbstractChannelHandlerContext:
abstract class AbstractChannelHandlerContext extends DefaultAttributeMap implements ChannelHandlerContext, ResourceLeakHint { private AbstractChannelHandlerContext findContextInbound() { AbstractChannelHandlerContext ctx = this; do { ctx = ctx.next; } while(!ctx.inbound); return ctx; } }
工厂模式源码举例
工厂模式要点回顾:
1、将创建对象的逻辑封装起来。
ReflectiveChannelFactory:
public class ReflectiveChannelFactory<T extends Channel> implements ChannelFactory<T> { private final Class<? extends T> clazz; public ReflectiveChannelFactory(Class<? extends T> clazz) { if(clazz == null) { throw new NullPointerException("clazz"); } else { this.clazz = clazz; } } public T newChannel() { try { return (Channel)this.clazz.newInstance(); } catch (Throwable var2) { throw new ChannelException("Unable to create Channel from class " + this.clazz, var2); } } }
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:2020面试题
精华推荐