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

设计模式简述(二十)规格模式

规格模式

  • 描述
    • 组件
  • 使用

描述

规格模式并不在传统的23设计模式中,属于后面扩展的设计模式。
简单描述就是对一批数据进行多条件(包括逻辑组合、有点装饰器的感觉,可以不断套娃)匹配。

组件

  • 实体
package dp.spec;/*** TODO** @author kal* @version 1.0.0* @date 2025/5/25 23:13*/
public class User {private Long id;private String name;private Integer age;private String gender;public User(Long id, String name, Integer age, String gender) {this.id = id;this.name = name;this.age = age;this.gender = gender;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +'}';}public static class UserBuilder {private Long id;private String name;private Integer age;private String gender;public static UserBuilder builder() {return new UserBuilder();}public UserBuilder id(Long id) {this.id = id;return this;}public UserBuilder name(String name) {this.name = name;return this;}public UserBuilder age(Integer age) {this.age = age;return this;}public UserBuilder gender(String gender) {this.gender = gender;return this;}public User build() {return new User(this.id, this.name, this.age, this.gender);}}
}
  • 通用匹配接口
public interface IUserSelector {List<User> query(IUserSpec spec);
}
  • 匹配接口实现
public class UserSelector implements IUserSelector {private final List<User> userList;public UserSelector(List<User> userList) {this.userList = userList;}@Overridepublic List<User> query(IUserSpec spec) {List<User> result = new ArrayList<>();userList.forEach(user -> {if (spec.match(user)) {result.add(user);}});return result;}
}
  • 规格接口
public interface IUserSpec {boolean match(User user);IUserSpec and(IUserSpec userSpec);IUserSpec or(IUserSpec userSpec);IUserSpec not();
}
  • 实现组合逻辑的抽象规格类
public abstract class CompositeSpec implements IUserSpec {@Overridepublic IUserSpec and(IUserSpec userSpec) {return new AndSpec(this, userSpec);}@Overridepublic IUserSpec or(IUserSpec userSpec) {return new OrSpec(this, userSpec);}@Overridepublic IUserSpec not() {return new NotSpec(this);}
}
  • 组合规格
public class AndSpec extends CompositeSpec {private final IUserSpec first;private final IUserSpec second;public AndSpec(IUserSpec first, IUserSpec second) {this.first = first;this.second = second;}@Overridepublic boolean match(User user) {return first.match(user) && second.match(user);}
}public class OrSpec extends CompositeSpec {private final IUserSpec first;private final IUserSpec second;public OrSpec(IUserSpec first, IUserSpec second) {this.first = first;this.second = second;}@Overridepublic boolean match(User user) {return first.match(user) || second.match(user);}
}public class NotSpec extends CompositeSpec {private final IUserSpec first;public NotSpec(IUserSpec first) {this.first = first;}@Overridepublic boolean match(User user) {return !first.match(user);}
}
  • 具体业务规格
public class GenderEqSpec extends CompositeSpec {private final String gender;public GenderEqSpec(String gender) {this.gender = gender;}@Overridepublic boolean match(User user) {return Objects.equals(user.getGender(), gender);}
}public class NameEqSpec extends CompositeSpec {private final String name;public NameEqSpec(String name) {this.name = name;}@Overridepublic boolean match(User user) {return Objects.equals(user.getName(), name);}
}

使用

public class Sample {public static void main(String[] args) {List<User> dataList = new ArrayList<>();dataList.add(User.UserBuilder.builder().id(1L).name("张三").age(10).gender("男").build());dataList.add(User.UserBuilder.builder().id(2L).name("李四").age(20).gender("女").build());dataList.add(User.UserBuilder.builder().id(3L).name("王五").age(30).gender("女").build());IUserSelector selector = new UserSelector(dataList);// 两个基本规格IUserSpec nameSpe = new NameEqSpec("张三");IUserSpec genderEqSpec = new GenderEqSpec("女");// 组合规格IUserSpec spec = nameSpe.and(genderEqSpec);List<User> result = selector.query(spec);System.out.println(result);}
}
http://www.lryc.cn/news/2391926.html

相关文章:

  • 符合Python风格的对象(覆盖类属性)
  • 题目 3314: 蓝桥杯2025年第十六届省赛真题-魔法科考试
  • Java八股-Java优缺点,跨平台,jdk、jre、jvm关系,解释和编译
  • linux 内核态和用户态定时器函数使用总结
  • 支持selenium的chrome driver更新到136.0.7103.113
  • 硬件服务器基础
  • LVS的DR模式部署
  • TRS收益互换平台开发实践:从需求分析到系统实现
  • 测试Bug篇
  • 【Linux系统移植】Cortex-A8 Linux系统移植(超详细)
  • 第十五届蓝桥杯大赛软件赛国赛Python 大学 C 组试做【本期题单: 设置密码、栈】
  • 报错SvelteKitError: Not found: /.well-known/appspecific/com.chrome.devtools.json
  • word添加页眉
  • JavaScript 中的 BigInt:当普通数字不够“大“时的救星
  • 通过mailto:实现web/html邮件模板唤起新建邮件并填写内容
  • 2025推客系统小程序开发:独立部署源码交付,高性价比裂变增长引擎
  • 【Python零基础入门系列】第6篇:Python 的数据结构世界(列表、字典、集合、元组)
  • MVCC 原理与并发控制实现
  • CentOS 7.0重置root密码
  • YOLOV11改进策略【最新注意力机制】CVPR2025局部区域注意力机制LRSA-增强局部区域特征之间的交互
  • 3D建模的全景图谱:从55个工具到元宇宙的数字革命
  • Kotlin 活动事件通讯跳转深度讲解
  • vue + ant-design + xlsx 实现Excel多Sheet页导出功能
  • 关于 Web 安全:6. 常见 CMS 开源系统风险点
  • DAY33 简单神经网络
  • OBOO鸥柏丨2025年鸿蒙生态+国产操作系统触摸屏查询一体机核心股
  • 【观成科技】Ymir勒索软件组织窃密木马RustyStealer加密通信分析
  • Vuer开源程序 是一个轻量级的可视化工具包,用于与动态 3D 和机器人数据进行交互。它支持 VR 和 AR,可以在移动设备上运行。
  • 浅谈学习(费曼学习法)
  • 高光谱成像相机:表型技术在林业育种和精确林业的应用