网站 目录结构,廉洁沈阳网站,百度客户端电脑版下载,网站编程所用的语言有行为设计模式之Strategy#xff08;策略#xff09;
摘要#xff1a;
策略模式是一种行为设计模式#xff0c;它定义一系列算法并封装为独立对象#xff0c;使它们可以相互替换。该模式让算法独立于使用它的客户端而变化#xff0c;适用于需要动态切换算法、避免大量条…行为设计模式之Strategy策略
摘要
策略模式是一种行为设计模式它定义一系列算法并封装为独立对象使它们可以相互替换。该模式让算法独立于使用它的客户端而变化适用于需要动态切换算法、避免大量条件语句、实现算法与使用代码分离的场景。文章通过Java代码示例展示了加减乘三种算法的策略实现并列举了电商定价、游戏AI、金融投资等典型应用领域。策略模式的核心优势在于提高代码扩展性和维护性符合开闭原则。
1意图
定义一系列的算法把它们一个个封装起来并且使它们可以相互替换。此模式使得算法可以独立于使用它们的客户而变化。
2结构 3适用性
Strategy 模式适用于
许多相关的类仅仅是行为有异。需要使用一个算法的不同变体。算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与其算法相关的数据结构。一个类定义了许多种行为
/*** author psd 行为设计模式之策略设计模式*/
public class StrategyPattern {public static void main(String[] args) {OperationContext context new OperationContext(new AddStrategy());context.executeStrategy(1, 2);context new OperationContext(new SubStrategy());context.executeStrategy(1, 2);context new OperationContext(new MultiplyStrategy());context.executeStrategy(1, 2);}
}/*** 操作上下文*/
class OperationContext {private Strategy strategy;public OperationContext(Strategy strategy) {this.strategy strategy;}public void executeStrategy(int a, int b) {strategy.doOperation(a, b);}
}/*** 策略接口*/
interface Strategy {/*** 执行策略* * param a* 参数a* param b* 参数b* return 结果*/public void doOperation(int a, int b);
}class AddStrategy implements Strategy {Overridepublic void doOperation(int a, int b) {System.out.println(加法 (a b));}
}class SubStrategy implements Strategy {Overridepublic void doOperation(int a, int b) {System.out.println(减法 (a - b));}
}class MultiplyStrategy implements Strategy {Overridepublic void doOperation(int a, int b) {System.out.println(乘法 (a * b));}
}1、需要在运行时动态选择算法或行为
当系统需要在多种算法中选择一种执行且这个选择可能需要在程序运行时例如根据用户输入、配置、环境条件动态决定时。
例子
排序算法 一个排序工具类可能根据数据量的大小、是否已部分有序等因素在运行时选择使用快速排序、归并排序、插入排序等不同的算法。
导航系统 导航应用允许用户选择最快路线、最短距离、避开收费、避开高速等不同的路线计算策略。
支付系统 在结账时用户可以选择不同的支付策略支付宝、微信支付、信用卡、PayPal。系统根据用户的选择调用对应的支付处理逻辑。
数据压缩/加密 根据需求选择不同的压缩算法ZIP, GZIP, RAR或加密算法AES, DES, RSA。
2、存在多种相似算法或行为仅具体实现不同
当完成同一项任务存在多种不同的方式算法这些方式在概念上做的是同一件事但实现细节不同时。
例子
文件解析 需要解析不同格式的文件CSV、JSON、XML每种格式的解析逻辑不同但最终目标都是将文件内容转换为内部数据结构。
渲染引擎 一个图形渲染系统可能需要支持渲染到不同的目标屏幕、PDF文件、SVG矢量图。每种目标有不同的渲染实现但渲染的基本流程如绘制形状、文本是相似的。
日志记录 日志可以输出到不同的目的地控制台、文件、数据库、网络服务。记录日志的核心行为记录信息是相同的但输出的具体方式不同。
折扣计算 电商系统中计算商品折扣有多种策略无折扣、固定折扣、百分比折扣、满减、会员折扣等。它们都是计算最终价格但计算规则各异。
3、需要避免使用大量的条件语句if-else / switch-case来选择算法
当客户端代码中充斥着大量的条件分支来判断应该使用哪种算法时代码会变得臃肿、难以阅读和维护。添加新的算法或修改现有算法逻辑都需要修改这些条件分支违反开闭原则。
策略模式的价值 它将每个算法封装在独立的策略类中。客户端代码不再直接判断和执行算法而是持有一个策略接口的引用并通过这个接口调用算法。算法的选择即具体策略对象的创建和设置可以集中管理如使用工厂模式或由更高层代码如用户配置决定从而消除了客户端代码中的条件分支。
4、算法的实现细节需要与使用它的代码分离
当算法的具体实现比较复杂、可能经常变化或者你希望将算法的实现细节对客户端代码隐藏以降低耦合度时。
策略模式的价值 客户端代码只依赖于抽象的Strategy接口完全不知道具体策略类的内部实现。这使得算法实现的修改、优化甚至替换都不会影响到使用算法的客户端代码。
5、需要方便地扩展新的算法
当系统预期未来需要支持新的算法变体时。
策略模式的价值 添加一个新的算法策略变得非常简单只需要实现一个新的策略类符合Strategy接口即可。无需修改现有的策略类或使用算法的上下文类Context完美符合开闭原则。
4)常见应用领域举例
电商/零售系统
定价策略成本加成、竞争定价、促销定价、折扣策略、运费计算策略按重量、按体积、固定运费、免邮条件、库存分配策略FIFO, LIFO。
游戏开发
AI行为策略不同的敌人有不同的攻击或移动策略、伤害计算策略物理伤害、魔法伤害、真实伤害、资源收集策略。
金融系统
投资组合管理策略保守型、平衡型、激进型、风险评估策略、交易执行策略市价单、限价单、止损单。
数据处理/分析系统
数据清洗策略处理缺失值、异常值、特征选择策略、模型选择策略不同机器学习算法、数据导出格式策略CSV, Excel, JSON。
GUI框架/工具包
布局管理器策略FlowLayout, BorderLayout, GridLayout、组件绘制策略不同主题/Skin、事件处理策略不同平台可能有不同实现。
工具类库
Java中的Comparator接口是策略模式的经典应用。你可以为不同的排序需求实现不同的Comparator策略对象。ThreadPoolExecutor的拒绝策略AbortPolicy, CallerRunsPolicy, DiscardPolicy, DiscardOldestPolicy也是策略模式的应用。
网络通信
选择不同的网络传输协议策略TCP, UDP, HTTP、数据序列化策略JSON, Protobuf, XML、负载均衡策略轮询、随机、最少连接、响应时间。
喜欢我的文章记得点个在看或者点赞持续更新中ing…