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

圣辉友联网站建设一家只做外卖的网站

圣辉友联网站建设,一家只做外卖的网站,做公司网站需要注意什么,怎么免费建网站设计模式——过滤器模式在 Spring 中的实践 基础介绍模块介绍简单实现业务落地额外问题 基础介绍 过滤器模式(Filter Pattern),也称为标准模式(Criteria Pattern),是结构型设计模式之一,旨在通…

设计模式——过滤器模式在 Spring 中的实践

  • 基础介绍
  • 模块介绍
  • 简单实现
  • 业务落地
  • 额外问题

基础介绍

过滤器模式(Filter Pattern),也称为标准模式(Criteria Pattern),是结构型设计模式之一,旨在通过应用多个条件标准来筛选对象集合。此模式的核心思想是允许对象集合按照不同的标准被过滤,并可以灵活组合这些标准进行复杂的筛选操作。在开发中,尤其是在需要根据多种动态条件对数据进行筛选时,这种模式具有极大的灵活性和可扩展性

这个模式特别适合以下场景:

  • 有大量对象集合,需要根据不同标准进行筛选
  • 筛选条件是动态的或组合复杂度较高
  • 希望筛选逻辑与对象本身的结构解耦,从而保持代码清晰、可扩展

模块介绍

  • 过滤器接口(Filter/Criteria):定义过滤行为的接口,所有的标准都需要实现这个接口
  • 具体过滤器类(ConcreteFilter/ConcreteCriteria):实现标准接口,封装具体的筛选逻辑
  • 对象集合(Items/Objects to be filtered):要被过滤的对象集合。这些对象通常是具有共同属性的实例,例如一组人、一组产品等
  • 客户端(Client):使用具体过滤器类来筛选对象集合。客户端将对象集合和过滤器结合起来,以获得符合条件的对象

请添加图片描述

简单实现

定义实体类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Person {/*** 名称*/private String name;/*** 性别*/private String gender;/*** 婚姻状况*/private String maritalStatus;
}

接口:

/*** 过滤器,进行筛选*/
public interface Filter {/*** 筛选出符合标准的返回* @param persons 集合* @return 返回符合标准的集合*/List<Person> filter(List<Person> persons);
}

子类

/*** 筛选出男性*/
public class FilterMale implements Filter {@Overridepublic List<Person> filter(List<Person> persons) {List<Person> malePersons = new ArrayList<Person>();for (Person person : persons) {if(person.getGender().equalsIgnoreCase("男")){malePersons.add(person);}}return malePersons;}
}/*** 筛选出女性*/
public class FilterFemale implements Filter {@Overridepublic List<Person> filter(List<Person> persons) {List<Person> femalePersons = new ArrayList<Person>();for (Person person : persons) {if(person.getGender().equalsIgnoreCase("女")){femalePersons.add(person);}}return femalePersons;}
}

测试:

    public static void main(String[] args) {List<Person> persons = getPerson();//男性Criteria male = new CriteriaMale();//单身Criteria single = new CriteriaSingle();//女性CriteriaFemale criteriaFemale = new CriteriaFemale();printPersons("女性: ", criteriaFemale.meetCriteria(persons));printPersons("单身: ", single.meetCriteria(persons));}

业务落地

在真实业务中,肯定不能写向上面 case 一样的代码,在真实场景落地的时候,我们会遇到以下痛点:

  • spring 容器管理依赖,但是使用过滤器模式时,我们可能需要一个 POJO 的类,来管理过滤过程中的各种数据。我们可能在过滤的过程中,需要查询 缓存、db 中的各种数据,这个时候我们可以在构造函数中将依赖传入,或者使用类似 SpringUtil 的组件获取,那在该场景中需要如何优雅的让非 spring 管理的类去访问 spring 容器中的类呢
  • 上面的 case 除了 persons 没有其它任何信息,在实际使用的过程中,我们可能需要传入一些额外信息,来辅助过滤。我们应该如何处理呢

为此,我们可能需要做以下改动:

接口:

/*** 过滤器,进行筛选*/
public interface Filter<T, A> {/*** 筛选出符合标准的返回* @param persons 集合* @return 返回符合标准的集合*/List<T> filter(List<T> data, A additionalData);/*** 获取过滤器策略** @return 过滤器策略*/FilterStrategyEnum getFilterStrategy();
}

枚举类就不用特地贴出来了,我们来看看实现类:

/*** 筛选出男性*/
@Slf4j
@Service
public class FilterMale implements Filter<Person, MaleFilterEntity> {@Resourceprivate UserCommentService userCommentService;@Overridepublic List<Person> filter(List<Person> persons, MaleFilterEntity additionalData) {List<Person> malePersons = new ArrayList<Person>();// 可能需要做一些查询操作userCommentService.query(additionalData.getCity());for (Person person : persons) {// 查出性别为男并且身高大于 x 的人if (person.getGender().equalsIgnoreCase("男") && person.getLength() > additionalData.getLength()){malePersons.add(person);}}return malePersons;}@Overridepublic FilterStrategyEnum getFilterStrategy() {return FilterStrategyEnum.MALE;}
}

在业务中,我们可能需要使用一个 chain 来注册或者使用拦截器

public class FilterChain<T> {private List<T> data;public FilterChain(List<T> data) {this.data = data;}public <A> FilterChain<T> filter(FilterStrategyEnum strategyEnum, A additionalData) {Filter filter = FILTER_MAP.get(strategyEnum);if (filter == null) {return this;}data = filter.filter(data, additionalData);return this;}public List<T> getData() {return data;}
}

我们要有一个地方管理枚举和实现类的对应关系:

@Configuration
public class FilterContext {public static final Map<FilterStrategyEnum, Filter> FILTER_MAP = new HashMap<>();@Resourceprivate List<Filter> filters;@PostConstructpublic void init() {filters.forEach(handler -> FILTER_MAP.put(handler.getFilterStrategy(), handler));}
}

至此,我们将过滤器模式嵌入工程中了,它与我们的业务代码完全解耦合,并且提供了可插排式的逻辑功能

额外问题

那么问题来了,上面的代码和下面代码,功能实现上一模一样,为什么还需要用上面的实现呢:

    public void filter(HashSet<FilterStrategyEnum> enumsSet) {if (CollectionUtils.isEmpty(persons)) {return;}if (enumsSet.contains(FilterStrategyEnum.MALE)) {filterMaleStrategy();}if (enumsSet.contains(FilterStrategyEnum.FEMALE)) {filterFemaleStrategy();}}

文章转载自:

http://jnOzXQIi.mcbqq.cn
http://FEGXt3FE.mcbqq.cn
http://aIHWjWRw.mcbqq.cn
http://w4cc0jZq.mcbqq.cn
http://Uuqn6hms.mcbqq.cn
http://w9bSqBK1.mcbqq.cn
http://HT02gSmO.mcbqq.cn
http://tA2tdCjS.mcbqq.cn
http://ORI9FiQe.mcbqq.cn
http://COoiuVmE.mcbqq.cn
http://jfT5AYfK.mcbqq.cn
http://KUcdjlZ3.mcbqq.cn
http://o6X0Ttio.mcbqq.cn
http://mVgDnEe7.mcbqq.cn
http://RGmFOFna.mcbqq.cn
http://AG54CCmk.mcbqq.cn
http://ioE2s73g.mcbqq.cn
http://e56DCBHP.mcbqq.cn
http://T9gI7ClD.mcbqq.cn
http://PqYipbsh.mcbqq.cn
http://JIgU3BGc.mcbqq.cn
http://vkjpVYe1.mcbqq.cn
http://OOxkQ6JO.mcbqq.cn
http://Tq5tffmu.mcbqq.cn
http://KtYkX5by.mcbqq.cn
http://PPz899ls.mcbqq.cn
http://Jyk1rI8X.mcbqq.cn
http://Y2oKIyZL.mcbqq.cn
http://gcOVIZdH.mcbqq.cn
http://cBMAkoeV.mcbqq.cn
http://www.dtcms.com/wzjs/707654.html

相关文章:

  • 徐州企业网站推广网站建设专家评审意见
  • html5 微信网站wordpress 搬迁
  • 可以免费建网站的网站备案 条例
  • 简洁网站模板素材网站域名代理备案
  • 长春做网站哪家便宜古镇做灯饰网站的公司
  • 沈阳网站建设哪里的公司比较好网站创建桌面快捷方式
  • 网站建设方案范例云服务器如何安装网站
  • 网站开发主管网站建设案例教程视频教程
  • wap网站制作需要多少钱佛山专业建站公司
  • 网站风格南宁个人网站建设
  • 兰州程序开发网站建设西安seo关键词排名优化
  • 深圳公司建站推广廊坊做网站优化
  • 阳江建设网站杭州百度快照优化排名推广
  • 公司网站被抄袭北京网站建设著名公司
  • 做商城网站用什么框架做企业网站收费价格
  • 接入服务商网站备案管理系统技术规范要求网络建设规范和网络维护管理规范属于选择题
  • php网站开发背景沈阳制作网站的人
  • 小榄做网站网站建设专家推荐乐云seo
  • 网站无搜索结果页面怎么做关于做网站的论文
  • 工艺礼品东莞网站建设路桥做网站
  • 网站开发的未来展望wordpress用户中心集成
  • 免费建网站平台哪个好中建八局一公司董事长
  • MAKA网站做H5怎么压缩图片wordpress端点设错自已进不去
  • 特效网站大全可以做h5网站
  • 大气绿色网站模板西安网站建设培训学校
  • 适合这手机浏览器主页的网站wordpress 验证码插件
  • 中小型企业网站设计与开发潍坊网站建设wancet
  • 自己创网站互联网保险与传统保险的区别
  • 简单网站php源码下载中文域名网站跳转
  • 福州软件网站开发培训班视频类网站开发