模版方法模式

模版方法模式中, 会在抽象的基类中定义业务逻辑的执行顺序, 而后将其中一部分步骤的实现延迟到子类中去实现.

template

几乎所有开源框架中都可以找到模版模式的使用案例. Netty框架就大量使用了模版方法模式. AOP其实也可以理解为模版方法模式. 切面中定义了针对切入点方法(模版方法)的增强逻辑, 所有的被切入的方法都可以看作是对模版方法的实现.

# Netty中的模版方法模式

Channel的生命周期状态变化决定了ChannelInBoundHandler中方法的执行顺序. ChannelInBoundHandler中提供了一系列的钩子方法供我们在Channel的某个特定事件发生时去执行特定的操作.

public abstract class SimpleChannelInboundHandler<I> extends ChannelInboundHandlerAdapter {

    private final TypeParameterMatcher matcher;
    private final boolean autoRelease;

    protected SimpleChannelInboundHandler() {
        this(true);
    }
    
    protected SimpleChannelInboundHandler(boolean autoRelease) {
        matcher = TypeParameterMatcher.find(this, SimpleChannelInboundHandler.class, "I");
        this.autoRelease = autoRelease;
    }    
    
    public boolean acceptInboundMessage(Object msg) throws Exception {
        return matcher.match(msg);
    }    

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    
        boolean release = true;
        try {
            if (acceptInboundMessage(msg)) {
                @SuppressWarnings("unchecked")
                I imsg = (I) msg;
                channelRead0(ctx, imsg);
            } else {
                release = false;
                ctx.fireChannelRead(msg);
            }
        } finally {
            if (autoRelease && release) {
                ReferenceCountUtil.release(msg);
            }
        }
    }

    protected abstract void channelRead0(ChannelHandlerContext ctx, I msg) throws Exception;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

Netty内置了一系列的channelHandler用于减少使用者的开发工作. 其中SimpleChannelInboundHandler提供了资源自动释放的功能.

当channel发生了读事件后, channel之上绑定的一系列channelHandler的channelRead方法将会被调用, 这一过程也是通过模版方法模式实现的, 当入站消息流动到SimpleChannelInboundHandlerchannelRead时. 它会先判断本次传递 的入站消息是否与泛型中定义类型一致, 当判断一致后向下强转类型为泛型类型, 而后交由模版方法channelRead0去执行开发者自定义逻辑. 而后在finally代码块中去释放资源的引用计数.

上次更新: 2022/3/11 15:12:48