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

策略模式实现

定义

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户端,从而提高代码的可维护性和可扩展性。

核心概念

策略接口(Strategy):定义所有具体策略必须实现的公共方法。
具体策略(Concrete Strategies):实现策略接口的具体算法。
上下文(Context):持有一个策略接口的引用,负责根据需要选择或切换策略。

JS实现(表单验证示例)

// 策略对象(验证器集合)
const Validators = {required: (value) => !value && value !== 0 ? '不能为空' : null,minLength: (value, min) => value.length < min ? `长度不能少于${min}` : null,email: (value) => !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value) ? '格式不正确' : null,
};// 上下文(验证器)
class Validator {constructor() {this.rules = {};}// 添加验证规则addRule(field, validatorName, ...params) {if (!this.rules[field]) this.rules[field] = [];this.rules[field].push({ validatorName, params });return this; // 链式调用}// 执行验证validate(formData) {const errors = {};for (const field in this.rules) {for (const rule of this.rules[field]) {const { validatorName, params } = rule;const value = formData[field];const errorMessage = Validators[validatorName](value, ...params);if (errorMessage) {errors[field] = errorMessage;break; // 只记录第一个错误}}}return errors;}
}// 使用示例
const validator = new Validator().addRule('username', 'required').addRule('password', 'required').addRule('password', 'minLength', 6).addRule('email', 'required').addRule('email', 'email');const formData = {username: '',password: '123',email: 'invalid-email'
};
// 输出: { username: '不能为空', password: '长度不能少于6位', email: '格式不正确'} 
console.log(validator.validate(formData));

Java实现

// 策略模式:用多态替代 if else
// 1. 策略接口
interface DiscountStrategy { double calculate(double price); }// 2. 具体策略(每个分支对应一个类)
class NormalDiscount implements DiscountStrategy {@Override public double calculate(double price) { return price; }
}
class MemberDiscount implements DiscountStrategy {@Override public double calculate(double price) { return price * 0.9; }
}
class HolidayDiscount implements DiscountStrategy {@Override public double calculate(double price) { return price * 0.8; }
}// 3. 上下文(通过策略实例动态选择行为,无 if else)
class DiscountContext {private DiscountStrategy strategy;public DiscountContext(DiscountStrategy strategy) { this.strategy = strategy; }public double calculateTotal(double price) { return strategy.calculate(price); }
}// 使用时直接选择策略,无需判断
public class Main {public static void main(String[] args) {DiscountContext context = new DiscountContext(new MemberDiscount());System.out.println(context.calculateTotal(100)); // 90.0(无 if else)}
}
http://www.dtcms.com/a/274262.html

相关文章:

  • PyTorch 与 Spring AI 集成实战
  • Matlab裁剪降水数据:1km掩膜制作实战
  • JavaAI时代:重塑企业级智能开发新范式
  • OpenCV 与深度学习:从图像分类到目标检测技术
  • 端口到底是个什么鬼?回答我!
  • 虚幻引擎5 GAS开发俯视角RPG游戏 #06-2:优化EffectActor类
  • 鸿蒙开发之ArkTS数组
  • 深度体验飞算JavaAI:一场Java开发效率的革命
  • HarmonyOS NEXT端云一体化开发初体验
  • IPA软件源预览系统源码(源码下载)
  • 【跟着PMP学习项目管理】项目管理 之 采购管理知识点
  • Axios之核心语法详解
  • 上位机知识篇---常见的文件系统
  • 用数学构建权限系统:从集合论到位运算的高效设计
  • 前端开发—全栈开发
  • 主从服务器完整使用指南
  • 4万亿英伟达,凭什么?
  • SM712.TCT Semtech TVS二极管——电子设备的终极电路守护
  • 和鲸社区深度学习基础训练营2025年关卡2(1)纯numpy
  • 小皮面板搭建pikachu
  • 在 Linux 中配置天气机器人脚本开机自启动的完整指南
  • T16IZ遥控器教程__遥控器与无人机对频
  • 人形机器人公司融合Xsens与Manus动作捕捉技术,利用人工智能训练机器人模仿人类动作,以执行复杂任务
  • 开源“具身大脑” 实现不同机器人群体协作-RoboBrain
  • 弧焊机器人气体全方位节能指南
  • 基于MuJoCo的宇树科技G1机器人基础动作仿真研究
  • 企业培训笔记:Vue3前端框架配置
  • JAVA程序的类加载器的底层和双亲委派机制的原理
  • Bash函数详解
  • 软件开发那些基础事儿:需求、模型与生命周期