Java责任链模式如何应用于网络编程及其实例化?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1338个文字,预计阅读时间需要6分钟。
原文:本文先介绍了责任链模式的概念及简单实现。再介绍了netty中对责任链的实现。最后总结了一点思考。
1、概念相关
1.1 概念
责任链模式为请求的发送者和接收者解耦,使得请求的发送者与接收者之间没有直接交互。每个接收者都包含对下一个接收者的引用。如果一个接收者不能处理该请求,它会将该请求传递给链中的下一个接收者。改写后:本文简要介绍了责任链模式的基本概念与实现,并探讨了netty中责任链的实现方式。最后,总结了些许思考。
1. 责任链模式责任链模式通过创建一个接收者对象的链,使请求发送者与接收者解耦,实现请求发送者与接收者之间无直接交互。每个接收者对象包含对下一个接收者的引用,若当前接收者无法处理请求,则将其传递给链中的下一个接收者。
本文先介绍了责任链模式的概念及简单实现。再贴了netty中对责任链的实现。最后总结了一点点思考。
1、概念相关
1.1、概念
责任链模式为请求创建了一个接收者对象的链,每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,沿着这条链传递请求,直到有对象处理它为止。
1.2、解决了什么:
客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
1.3、场景:
1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3、可动态指定一组对象处理请求。
2、简单实现
2.1 代码
注:代码中getter 和 setter都省略
定义一个请求
public class Request { private String name; private int days; }
定义一个返回结果
public class Result { private boolean agree; public Result(boolean agree) { this.agree = agree; } }
定义一个处理接口
public interface Handler { // 每个处理器持有链,能取到链上的请求或者传递请求 Result deal(Chain chain); interface Chain { // 获取请求 Request request(); // 传递请求 Result proceed(Request request); } }
定义一个处理接口的链
public class HandlerChain implements Handler.Chain { // 持有链要处理的请求 private Request request; // 持有链上所有的处理器 private Queue<Handler> handlers; public HandlerChain(Request request) { this.request = request; } // 添加一个处理器 public HandlerChain addHandler(Handler handler) { if (handlers == null) { handlers = new LinkedList<>(); } handlers.add(handler); return this; } // 实现接口的方法- 获取请求 public Request request() { return request; } // 实现接口的方法- 处理请求 public Result proceed(Request request) { // 取队首的处理器开始请求。如果队首的处理器处理了,直接返回结果 // 如果队首的处理器选择传递请求,又会进这个proceed方法。取新的队首处理 // 为什么是传递而不是直接遍历队列,如果result = null,继续;result != null,返回呢? 因为传递的方式,可以对request再次处理。A处理器可以做简单处理,再传递给B。 Handler handler = handlers.poll(); return handler.deal(this); } }
定义三个处理者
public class AHandler implements Handler{ public Result deal(Chain chain) { Request request = chain.request(); // 只处理小于等于1的请求,大于1的请求被传递了 if (request.getDays() > 1) { // 这里可以对request做部分处理,再传递 return chain.proceed(request); } System.out.println("A处理了"); return new Result(true); } } public class BHandler implements Handler { public Result deal(Chain chain) { Request request = chain.request(); // 只处理小于等于2的请求,大于2的请求被传递了 if (request.getDays() > 2) { return chain.proceed(request); } System.out.println("B处理了"); return new Result(true); } } public class CHandler implements Handler { public Result deal(Chain chain) { Request request = chain.request(); // 只处理小于等于3的请求,大于3的请求被传递了 if (request.getDays() > 3) { return chain.proceed(request); } System.out.println("C处理了"); return new Result(true); } }
测试
public class Test { public static void main(String[] args) { // new 一个链,往链上添加处理器 Request request1 = new Request("hhy", 3); HandlerChain chains = new HandlerChain(request1).addHandler(new AHandler()).addHandler(new BHandler()).addHandler(new CHandler()); Result result1 = chains.proceed(request1); System.out.println("结果:" + result1.isAgree()); } }
结果
传入3:
返回:
C处理了
结果:true传入2:
返回:
B处理了
结果:true传入1:
返回:
A处理了
结果:true
3. netty中的责任链模式
用过netty的同学看到下面这个代码应该很熟悉了,非常简单netty客户端,创建连接,设置编解码器,发送请求。
public static void main(String[] args) { EventLoopGroup group = new NioEventLoopGroup(); NioSocketChannel channel = new NioSocketChannel(); Bootstrap bootstrap = new Bootstrap(); bootstrap.group(group).option(ChannelOption.TCP_NODELAY, true); InetSocketAddress address = new InetSocketAddress(InetAddress.getByName(www.runoob.com/design-pattern/chain-of-responsibility-pattern.html
[2] www.jb51.net/article/202504.htm
本文共计1338个文字,预计阅读时间需要6分钟。
原文:本文先介绍了责任链模式的概念及简单实现。再介绍了netty中对责任链的实现。最后总结了一点思考。
1、概念相关
1.1 概念
责任链模式为请求的发送者和接收者解耦,使得请求的发送者与接收者之间没有直接交互。每个接收者都包含对下一个接收者的引用。如果一个接收者不能处理该请求,它会将该请求传递给链中的下一个接收者。改写后:本文简要介绍了责任链模式的基本概念与实现,并探讨了netty中责任链的实现方式。最后,总结了些许思考。
1. 责任链模式责任链模式通过创建一个接收者对象的链,使请求发送者与接收者解耦,实现请求发送者与接收者之间无直接交互。每个接收者对象包含对下一个接收者的引用,若当前接收者无法处理请求,则将其传递给链中的下一个接收者。
本文先介绍了责任链模式的概念及简单实现。再贴了netty中对责任链的实现。最后总结了一点点思考。
1、概念相关
1.1、概念
责任链模式为请求创建了一个接收者对象的链,每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,沿着这条链传递请求,直到有对象处理它为止。
1.2、解决了什么:
客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
1.3、场景:
1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3、可动态指定一组对象处理请求。
2、简单实现
2.1 代码
注:代码中getter 和 setter都省略
定义一个请求
public class Request { private String name; private int days; }
定义一个返回结果
public class Result { private boolean agree; public Result(boolean agree) { this.agree = agree; } }
定义一个处理接口
public interface Handler { // 每个处理器持有链,能取到链上的请求或者传递请求 Result deal(Chain chain); interface Chain { // 获取请求 Request request(); // 传递请求 Result proceed(Request request); } }
定义一个处理接口的链
public class HandlerChain implements Handler.Chain { // 持有链要处理的请求 private Request request; // 持有链上所有的处理器 private Queue<Handler> handlers; public HandlerChain(Request request) { this.request = request; } // 添加一个处理器 public HandlerChain addHandler(Handler handler) { if (handlers == null) { handlers = new LinkedList<>(); } handlers.add(handler); return this; } // 实现接口的方法- 获取请求 public Request request() { return request; } // 实现接口的方法- 处理请求 public Result proceed(Request request) { // 取队首的处理器开始请求。如果队首的处理器处理了,直接返回结果 // 如果队首的处理器选择传递请求,又会进这个proceed方法。取新的队首处理 // 为什么是传递而不是直接遍历队列,如果result = null,继续;result != null,返回呢? 因为传递的方式,可以对request再次处理。A处理器可以做简单处理,再传递给B。 Handler handler = handlers.poll(); return handler.deal(this); } }
定义三个处理者
public class AHandler implements Handler{ public Result deal(Chain chain) { Request request = chain.request(); // 只处理小于等于1的请求,大于1的请求被传递了 if (request.getDays() > 1) { // 这里可以对request做部分处理,再传递 return chain.proceed(request); } System.out.println("A处理了"); return new Result(true); } } public class BHandler implements Handler { public Result deal(Chain chain) { Request request = chain.request(); // 只处理小于等于2的请求,大于2的请求被传递了 if (request.getDays() > 2) { return chain.proceed(request); } System.out.println("B处理了"); return new Result(true); } } public class CHandler implements Handler { public Result deal(Chain chain) { Request request = chain.request(); // 只处理小于等于3的请求,大于3的请求被传递了 if (request.getDays() > 3) { return chain.proceed(request); } System.out.println("C处理了"); return new Result(true); } }
测试
public class Test { public static void main(String[] args) { // new 一个链,往链上添加处理器 Request request1 = new Request("hhy", 3); HandlerChain chains = new HandlerChain(request1).addHandler(new AHandler()).addHandler(new BHandler()).addHandler(new CHandler()); Result result1 = chains.proceed(request1); System.out.println("结果:" + result1.isAgree()); } }
结果
传入3:
返回:
C处理了
结果:true传入2:
返回:
B处理了
结果:true传入1:
返回:
A处理了
结果:true
3. netty中的责任链模式
用过netty的同学看到下面这个代码应该很熟悉了,非常简单netty客户端,创建连接,设置编解码器,发送请求。
public static void main(String[] args) { EventLoopGroup group = new NioEventLoopGroup(); NioSocketChannel channel = new NioSocketChannel(); Bootstrap bootstrap = new Bootstrap(); bootstrap.group(group).option(ChannelOption.TCP_NODELAY, true); InetSocketAddress address = new InetSocketAddress(InetAddress.getByName(www.runoob.com/design-pattern/chain-of-responsibility-pattern.html
[2] www.jb51.net/article/202504.htm

