首页 国际新闻正文

验孕棒一深一浅,Java描绘规划形式(15):职责链形式,处理常见批阅流事务,江淮瑞风

本文源码GitHub || GitEE

一、日子场景描绘

1、请假阅览龇螂流程

公司常见的请假阅览流程:请假天数

当 day<=3 天,项目经理阅览
当 3 < day <=5 天,部门经理阅览
当 day > 5 天,CEO阅览

2、流程图解

3、代码完成

public class C01_InScene {
public static 验孕棒一深一浅,Java描绘规划方式(15):职责链方式,处理常见阅览流业务,江淮瑞风void main(String[] args) {
// 拼装职责链
AuditHandler h1 = new CeoManger();
AuditHandler h2 = new DeptManger();
AuditHandler h3 = new ProjectManger();
h3.setSuccessor(h2);
h2.setSuccessor(h1);
/*
* 测验输出
* 项目经理无权阅览
* 部门经理无权阅览
* CEO阅览:赞同【Cicada】,请假【6】天
*/
h3.山东志广世纪集团handleLeaveDay("Cicada",6);
}
}
abstract class Audit柳荣夏Handler {
//持有下一个处理恳求的目标
protected AuditHandler successor = 验孕棒一深一浅,Java描绘规划方式(15):职责链方式,处理常见阅览流业务,江淮瑞风null;
public AuditHandler getSuccessor() {
return successor;
黑陨石炸鸡}
public void验孕棒一深一浅,Java描绘规划方式(15):职责链方式,处理常见阅览流业务,江淮瑞风 setSuccessor(AuditHandler successor) {
this.successor = successor;
}
public abstract void handleLeaveDay (String user,Integer day);
}
/**
* 项目经理阅览
*/
class ProjectManger extends AuditHandler{
@Override
public void handleLeaveDay(String user, Integer dayairtripp) {
if (day <= 3){
System.out.println("项目经理阅览:赞同【"+user+"】,请假【"+da福州管家婆电话y+"】天");
} else {
System.out.println("项目经理无权阅览");
if (getSuccessor() != null){
getSuccessor().handleLeaveDay(user,day);
}
}
}
}
/**
* 部门经理阅览
*/
class DeptManger extends AuditHandler{
@Override
public void handleLeaveDay(String user, Integer day) {
if (day > 3 && day <= 5){
System.out.println("部门经理阅览:赞同【"+user+"】,请假【"+day+"】天");
} else {
System.out.println("部门经理无权阅览");
if (getSuccessor() != null){
getSuccessor().handleLeaveDay(user,day);
}
}
}
}
/**
*刘海燕状元 CEO阅览
*/
class CeoManger extends AuditHandler{
@Override
public void handleLeaveDay(String user, Integer day) {
if (day > 5){
System.out.println("CEO阅览:赞同【"+user+"】,请假【"+day+"】天");
} else {
if (getSuccessor() != null){
getSuccessor().handleLeaveDay(user,day);
}
}
}
}

二、职责链方式

1、根底概念

职责链方式是一种目标的行为方式翠鸟抓鱼遭冰封。在职责链方式里,许多目标由每一个目标对其下个的引证而连接起来构成一条链式结构。恳求在这个链上传递,直到链上的某一个目标有权处理该恳求。恳求的客户端不知道链上的哪个目标处理该恳求,这使得体系能够在不影响客户端的情况下动态地重新组织和分配职责目标。

2、中心人物

(1)、笼统处理者人物 界说处理恳求的接口。接口能够也能够给出一个办法以设定和回来对下个目标引证。这个人物一般由一个Java笼统类或许Java接口完成。

(2)、详细处理者人物 详细处理者接到恳求后,能够挑选将恳求处理掉,或许将恳求传给下个目标。因为详细处理者持有对下家的引证。

3、方式图解

4、源代码完成

public class C02_Chain {
public static void main(String[] args) {
// 拼装职责链
Handler handler1 = new ConcreteHandler();
Handler handler2 = new ConcreteHandler();
handler1.setHandler(handler2);
// 提交恳求
handler1.handlerRequest();
}
}
/**
* 笼统处理者人物
*/
abstract class Handler {
/*
* 持有后续的职责目标
*/
protected Handler handler;
/**
* 处理恳求的办法
*/
public abstract void handlerRequest();
public H天河区气候andler getHandler() {
return handler;
}
public void setHandler(Handler handler) {
this.handler = handler;
}
}
/**
* 详细处理者人物
*/
class ConcreteHandler extends Handler{
/**
* 调用该办法处理恳求
*/
@Overri看比de
public void handlerRequest() {
/*
* 判别是否有后续的职责目标,没有就出来恳求,有就直接放过
*/
if(getHandler() != null){
System.out.验孕棒一深一浅,Java描绘规划方式(15):职责链方式,处理常见阅览流业务,江淮瑞风println("放过恳求,下个目标处理.验孕棒一深一浅,Java描绘规划方式(15):职责链方式,处理常见阅览流业务,江淮瑞风..");
getHandler().handlerRequest();
} else{
System.out.println("直接处理恳求了...");
}
}
}

三、Spring结构使用

1、DispatcherServlet类

DispatcherServlet 中心办法 doDispatch。HandlerExecutionChain仅仅保护HaasiangirlndlerInterceptor的调集,能够向其间注册相应的拦截器,自身不直接处理恳求,将恳求分配给职责链上注册处理器履行,下降职责链自身与处理验孕棒一深一浅,Java描绘规划方式(15):职责链方式,处理常见阅览流业务,江淮瑞风逻辑之间的耦合程度。

HandlerExecutionChain mappedHandler = null;
mappedHaiggcasndler = this.getHandler(processedRequest);
mappedHandler.applyPreHandle(processedRequest, response);
mappedHandler.applyPostHandle(processedRequest, response, mv);

2、HandlerExecutionChain类

这儿剖析的几个办法,都是从DispatcherServlet类的doDispatch办法中恳求的。

  • 获取拦截器,履行preHandle办法。
boolean applyPreHandle(HttpServletRequest request, 
HttpServletResponse response) throws Exception {
HandlerInterceptor[] interceptors = this.getIntercept好像影院ors();
if (!ObjectUtils.isEmpty(interceptors)) {
for(int i = 0; i < interceptors.length; this.interceptorIndex = i++) {
HandlerInterceptor interceptor = interceptors[豪夺新夫很威猛i];
if (!interceptor.preHandle(request, resp贝露芙onse, this.handler)) {
this.triggerAfterCompletion(request, response, (Exception)null);
return false;
}
}
}
return true;
}
  • 在applyPreHandle办法中,履行triggerAfterCompletion办法。
void triggerAfterCompletion(HttpServletR坏青梅equest request, 
HttpServletResponse response, Exception ex) throws Exception {
HandlerInterceptor[] interceptors = this.getInterceptors();
if (!ObjectUtils.isEmpty(interceptors)) {
for(int i = this.interceptorIndex; i >= 0; --i) {
HandlerInterceptor interceptor = interceptors[i];
try {
interce验孕棒一深一浅,Java描绘规划方式(15):职责链方式,处理常见阅览流业务,江淮瑞风ptor.afterCompletion(request, response, this.handler, ex);
} c妃常淡定废材女玩棋迹atch (Throwable var8) {
logger.error("HandlerInterceptor.afterCompletion threw exception", var8);
}
}
}
}
  • 获取拦截器,履行applyPostHandle办法。
void applyPostHandle(HttpServletRequest requ爸爸不要est, 
HttpServletResponse response, ModelAndView mv)
throws Exception {
HandlerInterceptor[] interceptors = 萨尼布朗this.getInterceptors();
if (!ObjectUtils.isEmpty(interceptors)) {
for(int i = interceptors.length - 1; i >= 0; --i) {
HandlerInterceptor interceptor = interceptors[i];
interceptor.postHandle(request, response, this.handler, mv);
}
}
}

四、方式总结

(1)、将恳求和处理逻辑分隔,完成解耦进步体系的灵活性;
(2)、当职责链过长时,功能会下降,测验也会变得复杂;
(3)、使用场景:请假、加薪、费用等常见的阅览流程;

引荐相关阅览:

Java描绘规划方式:观察者方式

Java描绘规划方式:装修方式

Java描绘规划方式:组合方式

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。