java设计模式-责任链设计模式
Posted 风某人~Wind
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java设计模式-责任链设计模式相关的知识,希望对你有一定的参考价值。
责任链模式是系统设计里面的一种程序设计模式,他包含了一系列的请求对象和处理对象,每一个处理对象他知道他能处理哪些请求对象,也能知道他该不该把这个请求对象传给下一个处理对象,他就是一条链路,链路上都是一个个的处理对象。
这种程序设计模式适用于
1. 审批流程,审批级别较多,不同级别审批不同的事项。
2. 一个请求需要多个处理对象的场景
下面代码演示了一个场景,当用户发布了一篇博客,平台需要进行一系列的操作进行审核,比如说需要对非法字符,文章中的恶意脚本进行转义,文章中的图片进行审核,还有防sql注入等操作进行审核。
代码如下:
定义一个消息处理基类
/**
* @Auther: wan
* @Date: 2022/8/23 10:53
* @Description: 消息处理器基类
* @version: 1.0
*/
public interface MessageHandle
/**
* 执行器
*/
void doFilter(MessageRequest moneyRequest);
/**
* 下一个执行器
*/
MessageHandle getHandle();
/**
* 设置执行器
*/
void setHandle(MessageHandle moneyHandle);
/**
* 优先级
*/
int getPriority();
消息请求实体
/**
* @Auther: wan
* @Date: 2022/8/14 10:56
* @Description: 消息请求实体
* @version: 1.0
*/
@Data
public class MessageRequest
/**
* 请求消息内容
*/
private String message;
/**
* 创作人名称
*/
private String name;
处理对象实现类
防SQL注入转义处理器
/**
* @Auther: wan
* @Date: 2022/8/23 14:27
* @Description: 防SQL注入转义处理器
* @version: 1.0
*/
public class DefenseSQLInjectionHandle implements MessageHandle
/**
* 下一个处理器
*/
private MessageHandle moneyHandle;
/**
* 名称
*/
private String name;
public DefenseSQLInjectionHandle(String name)
this.name = name;
@Override
public void doFilter(MessageRequest messageRequest)
String message = messageRequest.getMessage();
/**
* 1. sql转义
*/
message = message.replaceAll("delete","");
message = message.replaceAll("update ","");
messageRequest.setMessage(message);
System.out.println("消息:【"+messageRequest.getMessage()+"】,处理器:【"+name+"】");
//还可以设置条件让他结束。
if (null == getHandle())
return;
getHandle().doFilter(messageRequest);
@Override
public void setHandle(MessageHandle moneyHandle)
this.moneyHandle = moneyHandle;
@Override
public int getPriority()
return 1;
@Override
public MessageHandle getHandle()
return this.moneyHandle;
特殊字符转义处理器
/**
* @Auther: wan
* @Date: 2022/8/23 12:14
* @Description: 特殊字符转义处理器
* @version: 1.0
*/
public class SpecialCharacterHandle implements MessageHandle
/**
* 下一个处理器
*/
private MessageHandle moneyHandle;
/**
* 名称
*/
private String name;
public SpecialCharacterHandle(String name)
this.name = name;
@Override
public void doFilter(MessageRequest messageRequest)
String message = messageRequest.getMessage();
/**
* 1. 特殊字符转义,在这里只是举例子
*/
message = message.replaceAll("<","[");
message = message.replaceAll(">","]");
messageRequest.setMessage(message);
System.out.println("消息:【"+messageRequest.getMessage()+"】,处理器:【"+name+"】");
if (null == getHandle())
return;
getHandle().doFilter(messageRequest);
@Override
public void setHandle(MessageHandle moneyHandle)
this.moneyHandle = moneyHandle;
@Override
public int getPriority()
return 0;
@Override
public MessageHandle getHandle()
return this.moneyHandle;
还可以自己自定义处理器,可以自己自定义扩展一些逻辑
自定义处理器
/**
* @Auther: wan
* @Date: 2022/8/23 11:05
* @Description: 自定义处理器
* @version: 1.0
*/
public class CustomHandle implements MessageHandle
/**
* 下一个处理器
*/
private MessageHandle moneyHandle;
/**
* 名称
*/
private String name;
/**
* 构造方法
* @param
*/
public CustomHandle(String name)
this.name = name;
/**
* 执行逻辑方法
* @param messageRequest
*/
@Override
public void doFilter(MessageRequest messageRequest)
//获取消息
String message = messageRequest.getMessage();
/**
* 自定义处理器
* 1. 把一些比较重伤人的脏话转义一下
*/
message = message.replaceAll("傻杯","**");
/**
* 可以对消息进行自定义操作。
*/
if (message.indexOf("沙雕") > -1)
System.out.println("审核不通过,内容带有敏感字:【沙雕】");
return;
messageRequest.setMessage(message);
System.out.println("消息:【"+messageRequest.getMessage()+"】,处理器:【"+name+"】");
if (null == getHandle())
return;
getHandle().doFilter(messageRequest);
@Override
public void setHandle(MessageHandle moneyHandle)
this.moneyHandle = moneyHandle;
@Override
public int getPriority()
return 10;
@Override
public MessageHandle getHandle()
return this.moneyHandle;
测试类
根据优先级高低对消息进行依次处理。
/**
* @Auther: wan
* @Date: 2022/8/14 15:10
* @Description: 测试类
* @version: 1.0
*/
public class Main
private void Test02(MessageRequest moneyRequest)
List<MessageHandle> MessageList = new ArrayList<>();
SpecialCharacterHandle specialCharacterHandle = new SpecialCharacterHandle("特殊字符转义处理器");
DefenseSQLInjectionHandle defenseSQLInjectionHandle = new DefenseSQLInjectionHandle("防SQL注入转义处理器");
CustomHandle customHandle = new CustomHandle("自定义处理器");
MessageList.add(specialCharacterHandle);
MessageList.add(defenseSQLInjectionHandle);
MessageList.add(customHandle);
//对优先级进行排序
List<MessageHandle> list = MessageList.stream().sorted(new Comparator<MessageHandle>()
@Override
public int compare(MessageHandle o1, MessageHandle o2)
if (o1.getPriority() > o2.getPriority())
return o2.getPriority();
else
return o1.getPriority();
).collect(Collectors.toList());
System.out.println(list);
MessageHandle handle = null;
for (int i = 0; i < list.size(); i++)
//先赋值
if (null == handle)
handle = list.get(i);
if (i < (list.size()-1))
list.get(i).setHandle(list.get(i+1));
list.get(0).doFilter(moneyRequest);
public static void main(String[] args)
MessageRequest moneyRequest = new MessageRequest();
moneyRequest.setMessage("大家好!<script>alter('xxoo')</script>,傻杯!!!");
moneyRequest.setName("风某人");
Main main = new Main();
main.Test02(moneyRequest);
以上是关于java设计模式-责任链设计模式的主要内容,如果未能解决你的问题,请参考以下文章