设计模式之责任链模式
概念定义
1 2 3 4 5 6 7 8
| 菜鸟教程定义:顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 个人理解:责任链模式就是一个请求在多个处理器(就是需要执行各种方法达到需求的java类)之间进行按顺序的执行,他的一个主要优点就是可以手动设置执行的顺序,设置下一个处理器,进行代码上的解耦 在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推 场景: 身份认证:可以将身份认证请求传递给不同的认证处理器,例如进行密码验证、指纹验证、证书验证等。 请求拦截与过滤:可以将请求传递给多个过滤器,每个过滤器根据特定条件判断是否拦截请求或继续传递。 购买流程:可以将购买请求传递给不同的处理器,例如库存检查、价格计算、支付处理等 总之,责任链模式适用于有多个处理器可以处理同一类型请求、需要灵活调整处理顺序、需要解耦发送者和接收者、需要保证请求被处理等场景。它可以提高系统的灵活性、可扩展性和可维护性,并降低系统的耦合
|
代码实现
- 责任链模式的一个测试类,这里面就展示了具体是怎么样的一个流程
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
| package com.jw.cloud.modulepattern.chain;
public class Client { public static void main(String[] args) { Handler handlerX = new ConcreteHandlerAddition(); Handler handlerY = new ConcreteHandlerMultiplication(); Handler handlerZ = new ConcreteHandlerDivision(); handlerX.setNextHandler(handlerY); handlerY.setNextHandler(handlerZ);
Request requestA = new Request(); requestA.setNum1(7); requestA.setNum2(9); requestA.setRequestTag("加乘法除法"); handlerX.handleRequest(requestA); System.out.println("计算结果是:"+requestA.getRes());
} }
|
- 处理器—–加法
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
| package com.jw.cloud.modulepattern.chain;
public class ConcreteHandlerAddition implements Handler { private Handler nextHandler;
@Override public void setNextHandler(Handler handler) { this.nextHandler = handler; }
@Override public void handleRequest(Request request) { if (request.getRequestTag().contains("加")) { request.setRes(request.getNum1() + request.getNum2()+request.getRes()); if(nextHandler!=null){ nextHandler.handleRequest(request); } } else { System.out.println("No handler can handle the request: " + request.getRequestTag()); }
} }
|
- 处理器—-乘法
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
| package com.jw.cloud.modulepattern.chain;
public class ConcreteHandlerMultiplication implements Handler { private Handler nextHandler;
@Override public void setNextHandler(Handler handler) { this.nextHandler = handler; }
@Override public void handleRequest(Request request) { if (request.getRequestTag().contains("乘")) { request.setRes(request.getNum1() * request.getNum2()*request.getRes()); if(nextHandler!=null){ nextHandler.handleRequest(request); } } else { System.out.println("No handler can handle the request: " + request.getRequestTag()); } } }
|
- 处理器—-除法
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
| package com.jw.cloud.modulepattern.chain;
public class ConcreteHandlerDivision implements Handler { private Handler nextHandler;
@Override public void setNextHandler(Handler handler) { this.nextHandler = handler; }
@Override public void handleRequest(Request request) { if (request.getRequestTag().contains("除")) { request.setRes(request.getRes()/request.getNum1()); if(nextHandler!=null){ nextHandler.handleRequest(request); } } else { System.out.println("No handler can handle the request: " + request.getRequestTag()); } } }
|
- 处理器接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| package com.jw.cloud.modulepattern.chain;
public interface Handler {
void setNextHandler(Handler handler);
void handleRequest(Request request); }
|
- 封装的请求消息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package com.jw.cloud.modulepattern.chain;
import lombok.Data;
@Data public class Request { public int num1; public int num2;
public int res;
public String requestTag; }
|
计算结果
上述代码通过设置不同的执行顺序,可以得到不同的计算结果
总结
这个设计模式的用法以及定义都在前面阐述了,实际上需不需在公司项目用到这个设计模式,是根据实际情况来的,不能强行去使用设计模式噢!!!