策略模式代替臃肿if/else

简介: 项目中我们经常使用if/else分支,因为它可以使得程序通俗易懂;但是,遇到逻辑复杂的代码块时,过多的使用使得代码有些冗长、不好看,维护起来也比较麻烦,这时我们就可以用策略模式来代替;

一、 什么是策略模式

它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口 对所有的算法加以封装和实现,具体的算法选择 交由客户端决定(策略)。

44.png

二、 策略模式的角色

1、环境(Context)角色: 持有一个Strategy的引用。

2、抽象策略(Strategy)角色: 这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

3、具体策略(ConcreteStrategy)角色: 包装了相关的算法或行为。

三、策略模式的优缺点

优点:

1、代码中的if、switch判断逻辑可以去掉;

2、代码优雅、可复用、可读性好、便于维护;

3、策略模式遵循开闭原则,实现代码的解耦合;

缺点:

1、 策略如果很多的话就会出现很多策略类,会造成策略类膨胀;

2、 使用者必须清楚所有的策略类及其用途;

四、策略模式的实现

策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以互相替换。

策略模式使得算法可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来。

环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境独立开来,算法的修改不会影响环境和客户端。

五、策略模式的编写步骤

1.对策略对象定义一个公共接口。

2.编写策略类,该类实现了上面的公共接口。

3.在使用策略对象的类中保存一个对策略对象的引用。

4.在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值。

六、实列

抽象折扣类

publicinterfaceMemberStrategy {
/*** 计算原油的价格* @param crudeOilPrice    原油的原价* @return    计算出打折后的价格*/doublecalcPrice(doublecrudeOilPrice);
}

初级会员折扣类

publicclassPrimaryMemberStrategyImplimplementsMemberStrategy {
@OverridepublicdoublecalcPrice(doublecrudeOilPrice) {
System.out.println("对于初级会员的没有折扣");
returncrudeOilPrice;
    }
}

中级会员折扣类

publicclassIntermediateMemberStrategyimplementsMemberStrategy {
@OverridepublicdoublecalcPrice(doublecrudeOilPrice) {
System.out.println("对于中级会员的折扣为10%");
returncrudeOilPrice*0.9;
    }
}

高级会员折扣类

publicclassAdvancedMemberStrategyimplementsMemberStrategy {
@OverridepublicdoublecalcPrice(doublecrudeOilPrice) {
System.out.println("对于高级会员的折扣为20%");
returncrudeOilPrice*0.8;
    }
}

贵宾会员折扣类

publicclassVisitantMemberStrategyimplementsMemberStrategy {
@OverridepublicdoublecalcPrice(doublecrudeOilPrice) {
System.out.println("对于贵宾会员的折扣为25%");
returncrudeOilPrice*0.75;
    }
}

价格类

publicclassPrice {
//持有一个具体的策略对象privateMemberStrategystrategy;
/*** 构造函数,传入一个具体的策略对象* @param strategy    具体的策略对象*/publicPrice(MemberStrategystrategy){
this.strategy=strategy;
    }
/*** 计算原油的价格* @param crudeOilPrice    原油的原价* @return    计算出打折后的价格*/publicdoublequote(doublecrudeOilPrice){
returnthis.strategy.calcPrice(crudeOilPrice);
    }
}

总结:if else作为每种编程语言都不可或缺的条件语句,在编程时会大量的用到。一般建议嵌套不要超过三层,如果一段代码存在过多的if else嵌套,代码的可读性就会急速下降,后期维护难度也大大提高,可以利用策略模式来替代if/else。

相关文章
|
达摩院 Java 大数据
达摩院FunASR实时语音转写服务软件包发布
达摩院FunASR实时语音转写服务软件包发布
3152 0
达摩院FunASR实时语音转写服务软件包发布
|
安全 Java 数据库
SpringSecurity基础入门详解
SpringSecurity基础入门详解
651 0
|
应用服务中间件 索引 nginx
生产环境ES查询延迟排查
最近经常收到业务方配置的ES查询延迟告警,同样的请求手动在Kibana控制台执行只需几十毫秒就返回结果。受影响的整个链路情况如下,php应用程序通过部署在ES集群各节点上的nginx访问ES请求查询数据。
6099 0
|
8月前
|
自然语言处理 安全 机器人
2026年OpenClaw(原Moltbot、Clawdbot)极速部署教程及企业微信集成完整步骤
OpenClaw(前身为Moltbot、Clawdbot)针对企业微信集成场景优化了配置流程,无需复杂开发与代码编写,通过企业微信应用创建、权限开通、凭证配置与OpenClaw联动,即可实现两者无缝集成。集成后,用户可在企业微信单聊、群聊中直接与OpenClaw交互,完成办公自动化、智能问答、任务管理、消息推送等核心功能,适配企业内部协作与高效办公需求。本教程严格遵循官方适配逻辑,覆盖前期准备、全流程配置、功能验证及问题排查,确保操作可落地且信息原汁原味。
3272 4
|
7月前
|
人工智能 安全 Linux
OpenClaw阿里云/MacOS/Linux/Windows本地部署保姆级图文教程(免费api配置及14000+技能中30个Skill精选)
打开OpenClaw技能市场,14000+技能密密麻麻排列,滚动条细如发丝——这场景像极了走进巨型五金城,明明只想拧紧松动的桌腿,却被海量工具绕得眼花缭乱。多数用户的困境并非不会用,而是不知道“从哪起步、该装哪些、怎么组合”。正如参考文章所言:大模型是“大脑”,Skills是“手脚”,装对技能,AI才从“顾问”变身“执行者”;装错技能,只会陷入功能冗余、响应卡顿的困境。
1772 10
|
8月前
|
机器人 API 数据安全/隐私保护
保姆级教程:阿里云上及本地部署OpenClaw/Clawdbot+集成飞书等Skills步骤流程
在2026年企业协同办公数字化转型的浪潮中,OpenClaw(原Clawdbot、曾用名Moltbot)作为开源优先的AI代理与自动化平台,凭借灵活的部署方式、丰富的技能生态和零技术门槛的操作优势,成为企业提升办公效率的核心工具。无需专业编程基础,即可轻松实现文档生成、代码开发、任务自动化、多模态解析等多元功能,同时支持与飞书无缝集成,构建24小时响应的企业级AI机器人,打破办公工具割裂的痛点,实现指令直达、任务秒级执行。
1654 8
|
7月前
|
存储 人工智能 Linux
OpenClaw(Clawdbot)阿里云/本地部署及省Token(钱啊)教程:集成Claude-Mem编码记忆/压缩90%上下文
在使用Claude Code进行开发时,很多开发者都会陷入“Token消耗过快”的困境:跨会话开发需要重复传递历史代码、架构决策与踩坑记录,20000 Token的完整上下文会让成本飙升;而频繁切换会话又会导致记忆丢失,每次重新沟通都要重复说明背景,效率极低。
2656 0
|
8月前
|
自然语言处理 运维 安全
2026年阿里云OpenClaw(Clawdbot)快速部署+Telegram接入全指南
OpenClaw(曾用名Clawdbot/Moltbot)作为开源的AI自动化代理工具,凭借自然语言交互、多平台适配、任务自动化执行的核心能力,成为个人与小型团队提升工作效率的优选。2026年阿里云推出轻量应用服务器OpenClaw预装镜像,大幅降低部署门槛,而对接Telegram则能实现“聊天窗口下达指令,OpenClaw自动执行任务”的轻量化交互模式。本文将完整拆解阿里云轻量应用服务器部署OpenClaw的全流程,重点补充Telegram机器人创建、API配置、消息触发调试等关键步骤,包含实操代码与避坑技巧,零基础也能快速完成部署与集成。
2916 4
|
9月前
|
人工智能 算法 Java
Java+AI 核心指南:大模型丝滑接入与多模型统一范式
在AI深入企业应用的背景下,Java凭借稳定的工程化能力、成熟生态和存量系统兼容性,成为AI落地的关键。本文探讨Java如何高效集成AI,强调“用模型”而非“造模型”,聚焦复用现有技术栈、工程化落地与多模型统一管理,助力企业实现智能化升级。
721 0
|
存储 人工智能 数据可视化
2025年技术团队必看:10款提升研发效率的知识管理工具深度评测
在数字化时代,知识管理已成为提升个人与企业竞争力的关键。2025年,随着AI、大数据和云计算的发展,知识管理工具正向智能化、协作化方向演进。本文精选10款必备工具,涵盖Notion、Obsidian、语雀、飞书文档等,助你构建高效知识体系,把握未来趋势。
1697 0