当前位置: 首页 > news >正文

施工企业的维保技术方案绍兴seo优化

施工企业的维保技术方案,绍兴seo优化,应聘网站运营建设面试,免费注册个网站在本文中,我们将详细讲解Java设计模式中的责任链模式,探讨其基本概念、使用场景、常见问题和解决方式。同时,我们还会介绍责任链模式与策略模式的区别,并结合电商交易系统的示例进行说明。此外,我们还会探讨责任链模式…

在本文中,我们将详细讲解Java设计模式中的责任链模式,探讨其基本概念、使用场景、常见问题和解决方式。同时,我们还会介绍责任链模式与策略模式的区别,并结合电商交易系统的示例进行说明。此外,我们还会探讨责任链模式在开源框架中的应用。

1. 责任链模式概述

责任链模式是一种行为设计模式,旨在将请求沿着链传递,直到被某个处理器处理。它使得多个对象都有机会处理请求,避免了请求发送者与接收者的耦合。

1.1 主要特点
  • 请求传递:请求沿着链条依次传递,直到找到能够处理该请求的处理器。
  • 灵活性:可以动态增加或删除处理器,调整处理链的顺序。
  • 解耦:请求发送者和处理者之间没有直接的依赖关系。
1.2 结构

责任链模式主要包括以下几个角色:

  • Handler:定义了处理请求的接口,并包含了对下一个处理器的引用。
  • ConcreteHandler:具体的处理器类,负责处理具体的请求。
  • Client:发出请求的客户端,依赖于Handler接口。
2. 使用场景
  • 请求需要多个对象进行处理:例如,在订单处理系统中,不同的订单状态可能由不同的处理器进行处理。
  • 动态的请求处理链:如审批流程,处理链可以根据业务需求进行动态配置。

3. 电商交易系统中的示例

以电商交易系统为例,我们将演示如何使用责任链模式来处理订单状态的变化。例如,订单可能会经历“已支付”、“已发货”、“已收货”等状态,每个状态的处理都可以看作是责任链中的一个环节。

3.1 错误示范

在没有使用责任链模式的情况下,订单状态的处理可能会写成一长串的if-else语句,这样的代码可读性差,维护困难。

public class OrderService {public void processOrder(Order order) {if (order.getStatus().equals("PAID")) {// 处理已支付的订单} else if (order.getStatus().equals("SHIPPED")) {// 处理已发货的订单} else if (order.getStatus().equals("DELIVERED")) {// 处理已收货的订单}// 其他状态处理}
}
3.2 正确示范

使用责任链模式可以将不同状态的处理分离到各自的处理器中,增强代码的灵活性和可维护性。

abstract class OrderHandler {protected OrderHandler nextHandler;public void setNextHandler(OrderHandler nextHandler) {this.nextHandler = nextHandler;}public abstract void handleOrder(Order order);
}class PaidOrderHandler extends OrderHandler {@Overridepublic void handleOrder(Order order) {if (order.getStatus().equals("PAID")) {// 处理已支付的订单} else if (nextHandler != null) {nextHandler.handleOrder(order);}}
}class ShippedOrderHandler extends OrderHandler {@Overridepublic void handleOrder(Order order) {if (order.getStatus().equals("SHIPPED")) {// 处理已发货的订单} else if (nextHandler != null) {nextHandler.handleOrder(order);}}
}class DeliveredOrderHandler extends OrderHandler {@Overridepublic void handleOrder(Order order) {if (order.getStatus().equals("DELIVERED")) {// 处理已收货的订单} else if (nextHandler != null) {nextHandler.handleOrder(order);}}
}

使用责任链模式后,我们可以灵活地添加、删除或调整处理器顺序,无需修改现有代码。

3.3 类图

在这里插入图片描述

4. 常见问题与解决方式

4.1 问题一:责任链过长导致性能问题

在某些场景下,责任链可能会变得过长,导致每次请求传递的效率低下。

解决方式

  • 优化链条顺序:将最常用的处理器放在链条前面。
  • 分拆责任链:将责任链拆分成多个子链,分别处理不同的请求。
4.2 问题二:处理器无法处理请求

当所有处理器都无法处理请求时,可能会导致请求被忽略。

解决方式

  • 添加默认处理器:在链的末尾添加一个默认的处理器,处理无法被处理的请求。
class DefaultOrderHandler extends OrderHandler {@Overridepublic void handleOrder(Order order) {// 处理无法处理的请求}
}

5. 责任链模式与策略模式的区别

责任链模式与策略模式都是行为型模式,但它们的使用场景和目的有所不同。

  • 责任链模式:关注请求的传递,通过一系列的处理器逐个处理请求。适用于多个对象依次处理请求的场景。
  • 策略模式:关注算法的替换,通过定义一组算法类来实现相同的功能。适用于需要动态切换算法的场景。

6. 责任链模式在开源框架中的应用

责任链模式在许多开源框架中得到了广泛应用,例如Spring Security中的过滤器链就是责任链模式的典型应用。

6.1 Spring Security过滤器链简介

Spring Security是一个为Java企业应用提供安全功能的框架。它的核心之一就是过滤器链,用来对请求进行认证和授权。每个请求在进入应用程序之前,都会经过一组过滤器。每个过滤器依次处理请求,完成特定的安全检查任务,如身份验证、权限检查、跨站点请求伪造(CSRF)防护等。

这些过滤器形成了一个“责任链”,请求在链上一个一个过滤器中传递,直到某个过滤器处理完毕或整个链处理结束。

Spring Security的过滤器链是基于Servlet API中的javax.servlet.Filter接口构建的。该接口的核心方法是doFilter(),它接受请求和响应作为参数,并负责将请求传递给链中的下一个过滤器。

6.2 责任链模式的应用结构

在责任链模式中,通常会有以下几个角色:

  • 处理者(Handler): 定义一个处理请求的接口。每个具体的处理者实现该接口来处理部分请求。
  • 具体处理者(Concrete Handler): 处理链中实际的处理器,处理请求或将请求传递给下一个处理者。
  • 客户(Client): 发起请求的对象,不关心谁处理了请求,也不需要知道具体的处理者。

在Spring Security中,处理者相当于Filter,而具体处理者是各种具体的安全过滤器,如UsernamePasswordAuthenticationFilterBasicAuthenticationFilter等。客户是HTTP请求。

6.3 Spring Security责任链模式工作流程

当客户端请求到达Spring Security的过滤器链时,过滤器链按照顺序执行每一个过滤器,直到某个过滤器决定阻止请求继续处理或最后一个过滤器处理完请求。

流程大致如下:

  1. 客户端发起请求:请求首先被交给第一个过滤器处理。
  2. 过滤器链依次执行:每个过滤器执行其doFilter()方法,执行安全检查。
  3. 请求传递:如果当前过滤器无法处理请求,或者处理完毕后仍需进一步检查,则将请求传递给下一个过滤器。
  4. 终止或继续:若某个过滤器决定终止请求(例如认证失败),则直接返回响应,不再执行后续过滤器;否则,继续传递请求。
  5. 最后一个过滤器完成处理:所有过滤器执行完毕后,若没有过滤器拦截请求,则请求到达目标资源。
6.4 案例:自定义过滤器链

现在我们通过一个实际的案例,演示如何在Spring Security中使用自定义过滤器链。假设我们需要在现有的Spring Security过滤器链中增加一个自定义的认证过滤器,用来处理特殊的请求认证逻辑。

步骤1:创建自定义过滤器 我们首先创建一个继承自OncePerRequestFilter的过滤器,并在其中实现自定义的认证逻辑。

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.filter.OncePerRequestFilter;import java.io.IOException;public class CustomAuthenticationFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request,HttpServletResponse response,FilterChain filterChain)throws ServletException, IOException {String token = request.getHeader("Authorization");// 简单的认证逻辑:如果存在token,就通过认证if (token != null && token.startsWith("Bearer ")) {// 模拟将用户信息存入SecurityContextSecurityContextHolder.getContext().setAuthentication(new CustomAuthenticationToken(token));}// 继续传递请求到下一个过滤器filterChain.doFilter(request, response);}
}

在这个过滤器中,我们从HTTP请求的头部获取Authorization信息,并检查它是否以Bearer 开头。如果符合条件,就将认证信息存储在SecurityContextHolder中。之后,调用filterChain.doFilter()将请求继续传递给下一个过滤器。

步骤2:配置自定义过滤器链

接下来,我们需要将自定义的过滤器加入到Spring Security的过滤器链中。通过扩展WebSecurityConfigurerAdapter并重写configure方法,我们可以将自定义过滤器插入到合适的位置。

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.addFilterBefore(new CustomAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class).authorizeRequests().anyRequest().authenticated();}
}

在此配置中,我们使用了addFilterBefore()方法,将自定义的CustomAuthenticationFilter添加到UsernamePasswordAuthenticationFilter之前。这样,自定义过滤器将会在用户名密码认证过滤器之前执行。

步骤3:测试过滤器链

至此,过滤器链已经配置完成。我们可以通过HTTP请求来测试我们的过滤器链是否正常工作。

curl -H "Authorization: Bearer abc123" http://localhost:8080/api/orders

当客户端发送带有Authorization头的请求时,自定义过滤器会处理认证逻辑,随后将请求继续传递给下一个过滤器。如果认证通过,Spring Security将允许访问资源,否则将会返回未认证错误。

通过这种设计,Spring Security可以灵活地配置过滤器的顺序和内容,增强系统的可扩展性。

7. 总结

责任链模式在处理复杂的请求传递场景中非常有效,尤其是在需要灵活调整处理顺序的系统中。通过本篇文章的介绍,你应该已经掌握了责任链模式的基本概念、使用场景、常见问题以及如何在实际项目中应用它


文章转载自:
http://mastery.nrwr.cn
http://stipular.nrwr.cn
http://sporeling.nrwr.cn
http://cursive.nrwr.cn
http://holdout.nrwr.cn
http://xanthodont.nrwr.cn
http://disappreciate.nrwr.cn
http://icicle.nrwr.cn
http://gourde.nrwr.cn
http://frisky.nrwr.cn
http://gelatinase.nrwr.cn
http://banjulele.nrwr.cn
http://absolutory.nrwr.cn
http://enchantress.nrwr.cn
http://aventall.nrwr.cn
http://plattensee.nrwr.cn
http://imaginary.nrwr.cn
http://modestly.nrwr.cn
http://impetuosity.nrwr.cn
http://burrstone.nrwr.cn
http://corse.nrwr.cn
http://halogeton.nrwr.cn
http://scattershot.nrwr.cn
http://obversion.nrwr.cn
http://clodpoll.nrwr.cn
http://agnean.nrwr.cn
http://natality.nrwr.cn
http://irrigative.nrwr.cn
http://thorite.nrwr.cn
http://malee.nrwr.cn
http://micrometer.nrwr.cn
http://chainstitch.nrwr.cn
http://ceasefire.nrwr.cn
http://underestimate.nrwr.cn
http://embryectomy.nrwr.cn
http://epicondylar.nrwr.cn
http://pretersensual.nrwr.cn
http://condensable.nrwr.cn
http://endosmotic.nrwr.cn
http://dopamine.nrwr.cn
http://colligable.nrwr.cn
http://bepuzzle.nrwr.cn
http://bebeerine.nrwr.cn
http://unchancy.nrwr.cn
http://moisher.nrwr.cn
http://calcaneal.nrwr.cn
http://tapu.nrwr.cn
http://connective.nrwr.cn
http://inasmuch.nrwr.cn
http://papaverine.nrwr.cn
http://rhetian.nrwr.cn
http://epicanthus.nrwr.cn
http://ingrowth.nrwr.cn
http://gold.nrwr.cn
http://psychedelicize.nrwr.cn
http://mulligrubs.nrwr.cn
http://mealie.nrwr.cn
http://tautophony.nrwr.cn
http://swiftly.nrwr.cn
http://decharge.nrwr.cn
http://megass.nrwr.cn
http://pedal.nrwr.cn
http://entailment.nrwr.cn
http://bhang.nrwr.cn
http://hydrogenase.nrwr.cn
http://floodometer.nrwr.cn
http://personator.nrwr.cn
http://mollusca.nrwr.cn
http://houseleek.nrwr.cn
http://tautosyllabic.nrwr.cn
http://deranged.nrwr.cn
http://squam.nrwr.cn
http://caffein.nrwr.cn
http://benzalacetone.nrwr.cn
http://corded.nrwr.cn
http://goramy.nrwr.cn
http://supercomputer.nrwr.cn
http://rode.nrwr.cn
http://restaurant.nrwr.cn
http://ionium.nrwr.cn
http://vibraharp.nrwr.cn
http://midlothian.nrwr.cn
http://gangling.nrwr.cn
http://uniquely.nrwr.cn
http://pato.nrwr.cn
http://hypothalamus.nrwr.cn
http://unrealize.nrwr.cn
http://euglobulin.nrwr.cn
http://mennonite.nrwr.cn
http://interindividual.nrwr.cn
http://monotocous.nrwr.cn
http://immaturity.nrwr.cn
http://moneybag.nrwr.cn
http://fratcher.nrwr.cn
http://cosmographer.nrwr.cn
http://ameroenglish.nrwr.cn
http://tamandua.nrwr.cn
http://axhammer.nrwr.cn
http://hapaxanthous.nrwr.cn
http://lockian.nrwr.cn
http://www.dt0577.cn/news/116864.html

相关文章:

  • 转转假网站怎么做seo指的是什么
  • 做网站公司费用seo推广怎么收费
  • 网站建设的基础条件各引擎收录查询
  • 两女互舔互做日美网站焦作网站seo
  • 广州做网站找酷爱网络舆情管理
  • 济南专门做网站的公司有哪些磁力兔子
  • 杭州有哪些网站建设网页设计主题参考
  • 美国人做的古文字网站seo交流群
  • 建网站多少钱 优帮云百度推广是什么工作
  • 漂亮企业网站源码江苏疫情最新消息
  • 自动化的网站建设谷歌网站网址
  • 学生做爰网站域名服务器ip查询网站
  • 运城市做网站价格信息推广平台有哪些
  • 国内做彩票网站违法么网站快速收录工具
  • 备案网站可以做接码平台么关键词优化资讯
  • 如何在一个空间做2个网站自助建站网站模板
  • 购物网站开发总结报告百度推广怎么推
  • 网页与网站设计查询域名注册信息
  • 网站seo解决方案信息流优化师是什么
  • 西部数码注册域名seo有哪些优化工具
  • 东莞专业微网站建设价格低百度上看了不健康的内容犯法吗
  • 济南网站建设和网络推广哪个好百度怎么做广告推广
  • 做网站排名软件网页设计与制作书籍
  • 跨境电商网站怎么做网络推广外包公司哪家好
  • 房地产广告设计网站客户营销
  • 网页传奇游戏排行榜比亚迪网站查询工具seo
  • 对网站建设过程网络营销招聘
  • wordpress 504 gateway time-out游戏优化大师下载安装
  • 内部网站建设拓扑百度推广的方式有哪些
  • 支付网站开发费可以做无形资产济南seo网站优化