首页 > 其他分享 >你的职责链模式符合五大原则吗?-系统学习九

你的职责链模式符合五大原则吗?-系统学习九

时间:2022-12-05 17:02:38浏览次数:40  
标签:职责 class request response str 符合 五大 public


一、背景介绍

工作之余对于用到的设计模式进行总结再梳理,发现职责链模式的妙处以及五大原则的指导下更能发挥职责链模式的优势于是乎便有了这篇博文的诞生

阅读这篇文章会让小编陪着您一起游历职责链模式,以及体会职责链在五大原则的指导下更大作用的发挥;过程中还会涉及小编的学习过程中的思路、总结以及产生的问题,希望能够和您碰撞出更多的"车祸"。

二、学习思路

1.绘制模式的UML图
2.根据UML图编写代码
3.寻找模式的场景例子进行UML图的绘制
4.根据场景例子的UML图编写代码
5.职责链和五大原则的指导思考

三、学习过程

3.1.概念:

职责链模式(Chain of Responsibility): 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

3.2.模式uml图

你的职责链模式符合五大原则吗?-系统学习九_五大原则

3.3.模式uml图对应代码

/**
* 功能描述:客户端
*
* @Author:makang
* @Date: 2021/5/27 10:02
*/
public class Client {
public static void main(String[] args) {
//实例化节点1
Handler handler = new ConcreteHandler1();
//实例化节点2
Handler handler1 = new ConcreteHandler2();
//构建链
handler.setSuccessor(handler1);
//进行调用
handler.HandleRequest(20);
}
}
/**
* 功能描述:链中节点的抽象类
*
* @Author:makang
* @Date: 2021/5/26 18:00
*/
public abstract class Handler {
protected Handler successor;

public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void HandleRequest(int request);
}
/**
* 功能描述:节点1
*
* @Author:makang
* @Date: 2021/5/27 9:57
*/
public class ConcreteHandler1 extends Handler{

@Override
public void HandleRequest(int request) {
if(request >=0 && request < 10){
System.out.println("在0-10范围 审批通过");
}else{
if(successor != null){
successor.HandleRequest(request);
System.out.println("请求是否会返回=============");
}else {
System.out.println("已经走到了职责链的最后!!!");
}
}
}
}
/**
* 功能描述:节点2
*
* @Author:makang
* @Date: 2021/5/27 10:00
*/
public class ConcreteHandler2 extends Handler{
@Override
public void HandleRequest(int request) {
if(request >=10 && request < 50){
System.out.println("申请在10-50之间审批通过");
}else{
successor.HandleRequest(request);
}
}
}

3.4.filter拦截器对应的职责链需求

需要实现将请求中的HTML过滤和字符串替换,将最终结果返回

你的职责链模式符合五大原则吗?-系统学习九_java_02

3.5.filter拦截器对应的职责链uml图

你的职责链模式符合五大原则吗?-系统学习九_五大原则_03

3.6.filter拦截器对应的职责链代码

import java.util.ArrayList;
import java.util.List;

public class ServletMain {
public static void main(String[] args) {
Request request = new Request();
request.str = "大家好,我是~~;<script>,很高兴能够和大家沟通交流;我们都是007";
Response response = new Response();
response.str = "response返回参数";

//实例化过滤链对象
FilterChain chain = new FilterChain();
//给过滤链对象添加过滤对象
chain.add(new HTMLFilter()).add(new SensitiveFilter());
//执行过滤方法
chain.doFilter(request,response,chain);
System.out.println(request.str);
System.out.println(response.str);

}
}

/**
* filter接口
*/
interface Filter{
boolean doFilter(Request request,Response response,FilterChain filterChain);
}

/**
* html过滤filter实现
*/
class HTMLFilter implements Filter{

@Override
public boolean doFilter(Request request, Response response, FilterChain filterChain) {
request.str = request.str.replace("<","[").replace(">","]")+"--HTMLFilter";
filterChain.doFilter(request,response,filterChain);
response.str = response.str+"--HTMLFilter";
return true;
}
}

/**
* 请求类
*/
class Request{
String str;
}

/**
* 响应类
*/
class Response{
String str;
}

/**
* 字符串替换filter实现类
*/
class SensitiveFilter implements Filter{

@Override
public boolean doFilter(Request request, Response response, FilterChain filterChain) {
request.str = request.str.replace("007","0071")+"--SensitiveFilter";
filterChain.doFilter(request,response,filterChain);
response.str = response.str+"--SensitiveFilter";
return true;
}
}


/**
*过滤链类
*/
class FilterChain implements Filter{

//存放过滤对象集合
List<Filter> filters = new ArrayList<>();
int index = 0;

//添加过滤对象方法
public FilterChain add(Filter filter) {
filters.add(filter);
return this;
}

//实现根据过滤对象集合顺序进行过滤操作
@Override
public boolean doFilter(Request request, Response response, FilterChain filterChain) {
if(index == filters.size()){
return false;
}
Filter f = filters.get(index);
index ++;
return f.doFilter(request,response,filterChain);
}
}

注:filter自定义拦截器可以通过@Order()注解来设置先后顺序

3.7.扩展

需求

1.如何做到增加链中节点,符合开闭原则?
2.如何做到修改链中节点先后顺序,符合开闭原则?

方案:

1.非spring管理的项目:将链中的下一个节点的包路径放到配置文件中,调用过程中通过读取配置文件的包路径采用反射来获得下一个节点的对象
2.spring管理的项目:将链中的下一个节点的beanName放到配置文件中,调用过程中通过读取配置文件的beanName采用abstractBeanFactory.getBean(str)的方式获取下一个节点的对象

四、学习总结

收获:

1.复习了职责链模式
2.了解了Filter拦截对于职责链模式的运用
3.总结了职责链模式在五大原则指导下发挥的更加突出的作用

提出的问题(问题将在后续博文中解答):

1.职责链和状态模式的对比?
2.职责链和策略模式的对比?

五、升华

所谓天下武功唯快不破,天下代码唯设计模式不立,而设计模式再五大原则的强有力指导下会发挥更加突出的作用。


标签:职责,class,request,response,str,符合,五大,public
From: https://blog.51cto.com/u_14471711/5913078

相关文章

  • 什么样的事件会符合正太分布(如何直观判断是否是正太分布)
     1. 影响该事件的因素有无穷多个,而每个因素的影响又是无穷小,那么这个事件就服从正态分布;如果服从正态分布的随机变量它的均值为零、标准差为1,那么这个变量就服从标......
  • EBS: 职责
    --FND-Respon职责清单SELECTFR.RESPONSIBILITY_ID,--FR.APPLICATION_ID,FR.RESPONSIBILITY_NAMEAS"责任名",FA.APPLICATION_SHORT_NAME,......
  • 设计模式之职责链模式笔记
    这个模式用的不多,笔记之,病人去医院看病的例子,来自易说设计模式一书publicabstractclassDoctor{   publicabstractvoidseeDoctor(XiaoGongxiaoGong);   p......
  • 干货 | 五大关键点,帮助企业快速构建可落地的IT服务管理体系
    随着数字化转型的发展,IT运维管理环境日益复杂,对管理的要求也随之增高如何提升运维效率,快速落地做好运维管理,搭建一套IT服务管理必不可少,以往我们也对IT服务管理框架进行过总......
  • 开发人员使用Klocwork进行软件安全的五大原因
    开发人员使用Klocwork进行软件安全的五大原因  Klocwork专为企业DevOps和DevSecOps而构建,是首选的静态分析和SAST工具,用于保持高开发速度,同时还强制实施安全性......
  • 基于云边协同架构的五大应用场景革新
    从概念到场景落地,边缘云加速革新,颠覆体验,拟造丰沛生态。边缘云的概念自明确以来已有四个多年头。什么是边缘云?边缘云,即把公共云的能力放在离数据发生端和消费端最近的......
  • 职责链模式
    职责链模式:OA系统采购审批需求传统解决方案:   传统方案解决OA审批系统问题分析:   职责链模式基本介绍   职责链模式原理类图     ......
  • 命令查询职责分离 - CQRS
    概念CQRS是一种与领域驱动设计和事件溯源相关的架构模式,它的全称是CommandQueryResponsibilitySegregation,又叫命令查询职责分离,GregYoung在2010年创造了这个术......
  • 学习编程入门最适合的五大网站
    众所周知,浅显易懂的教程对于一个初学者的重要性。一、在线教程首先列出一些在线教程网站,这些在线教程网站通常都比较适合入门,可以作为开发学习路上的第一个阶梯,也可以作......
  • 单一职责原则详解
    目录介绍00.问题思考分析01.前沿基础介绍02.如何理解单一指责03.如何判断是否单一04.单一判断原则05.单一就更好么06.总结回顾一下00.问题思考分析01.如何理解类的单一指责,......