策略模式代替臃肿if/else

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

一、 什么是策略模式

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

44.png

二、 策略模式的角色

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

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

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

三、策略模式的优缺点

优点:

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

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

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

缺点:

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

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

四、策略模式的实现

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

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

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

五、策略模式的编写步骤

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

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

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

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

六、实列

抽象折扣类

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

相关文章
|
11天前
|
人工智能 搜索推荐 机器人
2026年OpenClaw Skills快速部署攻略:四大核心Skills+实战指南
OpenClaw作为2026年爆火的AI Agent框架,其真正的强大之处在于模块化的Skills扩展生态。这些技能插件如同为AI助手安装不同的“专业大脑”,让原本仅能基础对话的工具,升级为覆盖搜索、协作、自动化等多场景的全能助手。ClawHub作为官方技能市场,已收录数千款实用Skills,其中Find Skills、Multi Search Engine、Tavily Search、EvoMap四大核心技能更是必装基础,覆盖技能发现、全网搜索、AI优化查询、AI协作进化等核心需求。
1787 15
|
应用服务中间件 索引 nginx
生产环境ES查询延迟排查
最近经常收到业务方配置的ES查询延迟告警,同样的请求手动在Kibana控制台执行只需几十毫秒就返回结果。受影响的整个链路情况如下,php应用程序通过部署在ES集群各节点上的nginx访问ES请求查询数据。
5906 0
|
Cloud Native Java 中间件
如何在一个基座上安装更多的 Koupleless 模块?
通过简单的配置,让模块打包更小,从而在一个基座上安装更多的 Koupleless 模块,进一步降低资源成本。
如何在一个基座上安装更多的 Koupleless 模块?
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
|
Cloud Native 持续交付 Docker
云原生技术入门与实践:Docker容器化部署示例
【9月更文挑战第25天】在数字化转型的浪潮下,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,为初学者揭示云原生技术的核心概念及其应用价值。我们将以Docker容器为例,逐步引导读者了解如何将应用程序容器化,并在云端高效运行。这不仅是对技术趋势的跟随,更是对资源利用和开发效率提升的探索。
238 4
|
设计模式 运维 算法
Java设计模式-策略模式(15)
Java设计模式-策略模式(15)
356 1
|
数据采集 搜索推荐 安全
智慧城市的交通管理大数据模型
智慧城市交通管理系统借助大数据模型,通过全面收集交通数据(如监控、GPS、公共交通信息等),进行数据清洗和预处理,利用Python的Pandas进行数据管理。通过ARIMA等模型分析,预测交通流量、识别交通模式,支持智能信号控制、预测性维护和事件响应。这种集成分析与决策支持系统提升城市交通效率,确保出行安全,预示着未来交通管理的智能化和个性化趋势。【6月更文挑战第23天】
1489 10
|
算法
策略模式如何实现开闭原则?
【7月更文挑战第2天】策略模式如何实现开闭原则?
223 1
|
缓存 算法 NoSQL
Java中的分布式缓存与一致性哈希算法
Java中的分布式缓存与一致性哈希算法