首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【实战】在 SpringBoot 项目中用责任链模式做朋友圈信息审核

文章目录

一、责任链模式简单介绍

二、朋友圈审核流程分析

三、实战朋友审核流程

四、最后总结

我们天天讲设计模式,今天就动点真格,来点实战。

一、责任链模式简单介绍

责任链模式是一种行为设计模式,它允许你创建一个对象链来处理请求。

每个对象在接收到请求后,可选择处理请求或将其传递给链中的下一个对象。

这种方式可以使请求在发送者和接收者之间解耦,并且允许你在运行时动态地改变链的成员或顺序。

在 Java 中,责任链模式通常包含一个抽象处理者(Handler)和具体处理者(ConcreteHandler)的结构。

抽象处理者定义了处理请求的接口,具体处理者实现了处理请求的具体逻辑,并且可以将请求传递给下一个处理者。

通过构建一个处理者链,请求会依次经过每个处理者,直到找到合适的处理者处理请求或者请求到达链的末尾。

这种模式常用于需要根据请求的特性动态地决定由谁来处理请求的场景。

二、朋友圈审核流程分析

我们天天看朋友圈信息,也都发过朋友圈信息。对于朋友圈信息我们再熟悉不过。

一条朋友圈信息包含三种类型的信息:文字、图片,视频。

发一条朋友圈信息,我们可以单发文字、图片、视频,也可以进行信息组合:文字+图片,文字+视频。

现在要对一条朋友圈信息进行审核,你会怎么审?

如果这是一条复合朋友圈信息,文字审核不通过,后面的图片/视频也就没有审核的必要,你又会怎么审?

这里我们就用责任链模式来实战朋友圈信息的审核。

三、实战朋友审核流程

首先,我们定义一个处理器抽象类 AbstractHandler,它包含一个抽象的处理请求方法 handleRequest(),还有设置下一个hander的方法

import?java.util.List;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.util.CollectionUtils;import org.springframework.util.StringUtils;

abstract class AbstractHandler { // 责任链的下一个处理类 protected AbstractHandler nextHandler; abstract void handleRequest(FriendsInfo request); protected void setNextHandler(AbstractHandler nextHandler) { this.nextHandler = nextHandler; }}

其次,我们实现具体的处理器类,分别是文字处理、图片处理和视频处理类,这三个处理类构成了一个对象链,用来审核朋友圈信息。

class WordsHandler extends AbstractHandler {

@Override public void handleRequest(FriendsInfo request) { if (!StringUtils.isEmpty(request.getWords())) { // 文字审核处理 System.out.println("文字审核处理:" + request.getWords()); // 模拟审核通过 if(true){ nextHandler.handleRequest(request); } }else{ nextHandler.handleRequest(request); } }}

class ImgsHandler extends AbstractHandler {

@Override public void handleRequest(FriendsInfo request) { if(!CollectionUtils.isEmpty(request.getImgs())){ // 图片审核处理 System.out.println("图片审核处理:" + request.getImgs()); // 模拟审核通过 if(true){ nextHandler.handleRequest(request); } }else{ nextHandler.handleRequest(request); } }}

class VideoHandler extends AbstractHandler { @Override public void handleRequest(FriendsInfo request) { if (!StringUtils.isEmpty(request.getVideo())) { // 视频审核处理 System.out.println("视频审核处理:" + request.getVideo()); } }}

然后,我们定义一个朋友圈信息类 FriendsInfo,用于封装朋友圈的信息。

class?FriendsInfo?{ private String words; private List<String> imgs; private String video; public FriendsInfo(String words, List<String> imgs, String video) { this.words = words; this.imgs = imgs; this.video = video; }

public List<String> getImgs() { return imgs; } public void setImgs(List<String> imgs) { this.imgs = imgs; } public String getWords() { return words; } public void setWords(String words) { this.words = words; } public String getVideo() { return video; } public void setVideo(String video) { this.video = video; }}

接着,增加配置文件,用于构建对象链的Bean实例。

@Configurationclass MyConfiguration11 { // 构建责任链 @Bean public AbstractHandler getHandler(){ // 审核顺序:文字、图片、视频 WordsHandler wordsHandler = new WordsHandler(); ImgsHandler imgsHandler= new ImgsHandler(); VideoHandler videoHandler = new VideoHandler();//?按照审核顺序设置下一个审核对象 wordsHandler.setNextHandler(imgsHandler); imgsHandler.setNextHandler(videoHandler); return wordsHandler; }}

最后是测试类:

/** * 责任链简单应用 * */public class ChainHandlerTest2 {

public static void main(String[] args) { // 启动应用上下文 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfiguration11.class); // 获取bean AbstractHandler handler = context.getBean(AbstractHandler.class); ????//?创建不同的朋友圈信息进行审核 FriendsInfo request1 = new FriendsInfo("一条朋友圈信息", null, null); String[] array = {"一图", "二图", "三图"}; FriendsInfo request2 = new FriendsInfo("有图片的朋友圈信息", CollectionUtils.arrayToList(array),null); FriendsInfo request3 = new FriendsInfo("有视频的朋友圈信息", null, "视频信息"); // 提交审核 handler.handleRequest(request1); System.out.println("--------------------------------"); handler.handleRequest(request2); System.out.println("--------------------------------"); handler.handleRequest(request3); } }

运行结果:

文字审核处理:一条朋友圈信息--------------------------------文字审核处理:有图片的朋友圈信息图片审核处理:[一图, 二图, 三图]--------------------------------文字审核处理:有视频的朋友圈信息视频审核处理:视频信息

四、最后总结

责任链模式的适用场景:

多个对象可以处理同一个请求

当有多个对象可以处理同一类型的请求,但具体由哪个对象来处理请求在运行时确定时,可以使用责任链模式。每个对象都有机会处理请求,直到其中一个对象能够处理该请求为止。

请求的发送者和接收者需要解耦

责任链模式可以将请求的发送者和接收者解耦,发送者无需知道请求是由哪个接收者处理的,而接收者也无需知道请求的发送者是谁。

动态指定处理者

责任链模式允许动态地改变链中的成员或顺序,因此非常适合在运行时根据请求的特性动态地确定由谁来处理请求。

避免请求的发送者与接收者之间的紧耦合关系

责任链模式可以将请求的发送者与接收者之间的紧耦合关系降低到最低程度,使系统更加灵活和可维护。

处理请求的顺序不确定

如果请求的处理顺序不确定或者需要根据条件动态确定处理顺序,责任链模式可以很好地满足这一需求。

责任链模式适用于需要动态确定请求的处理者、解耦请求的发送者和接收者、以及处理多个对象都可以处理的同一类型请求的场景。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OlhNEfxQYxzcTkieiETxCXdg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com