策略模式(Strategy Pattern)
概念:
· 定义一系列算法,将它们封装起来,并使它们可以相互替换,使得算法的变化独立于客户端;
UML结构:
┌─────────────────┐ │ Strategy │ ← 抽象策略接口 │ + Algorithm() │ └─────────────────┘ ▲ │ ┌─────────────┼───────────────┐ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ ConcreteStrategyA │ ConcreteStrategyB │ ConcreteStrategyC │ ← 具体策略 │ + Algorithm() │ + Algorithm() │ + Algorithm() │ └─────────────┘ └─────────────┘ └─────────────┘ ▲ │ ┌─────────────────┐ │ Context │ ← 上下文 │ - strategy: Strategy │ │ + SetStrategy() │ │ + ExecuteAlgorithm() │ └─────────────────┘代码示例:
cs/// <summary> /// 抽象策略 /// </summary> public abstract class StrategyBase { public abstract void Algorithm(); } /// <summary> /// 具体策略A /// </summary> public class ConcreteStrategyA : StrategyBase { public override void Algorithm() { Console.WriteLine("执行策略A的算法"); } } /// <summary> /// 具体策略B /// </summary> public class ConcreteStrategyB : StrategyBase { public override float Algorithm() { Console.WriteLine("执行策略B的算法"); } } /// <summary> /// 具体策略C /// </summary> public class ConcreteStrategyC : StrategyBase { public override void Algorithm() { Console.WriteLine("执行策略C的算法"); } } /// <summary> /// 上下文 /// </summary> public class Context { public StrategyBase _currentStrategy; // 当前策略 public Context(StrategyBase strategy) { this._currentStrategy = strategy; } public void SetStrategy(StrategyBase strategy) { this._currentStrategy = strategy; } public void ExecuteStrategy() { this._currentStrategy.Algorithm(); } } /// <summary> /// 客户端 /// </summary> public class Client { public static void Main() { StrategyBase concreteStrategyA = new ConcreteStrategyA(); StrategyBase concreteStrategyB = new ConcreteStrategyB(); StrategyBase concreteStrategyC = new ConcreteStrategyC(); Context context = new Context(concreteStrategyA); context.ExecuteStrategy(); context.SetStrategy(concreteStrategyB); context.ExecuteStrategy(); context.SetStrategy(concreteStrategyC); context.ExecuteStrategy(); } }特点:
优点:· 算法可以独立于上下文变化,符合开闭原则;
· 可以避免出现大量的if/else语句,提高代码的可维护性;
· 策列之间可以相互切换,灵活性更高;
· 增加新的策略时无需修改上下文,扩展性好;
缺点:· 类的层次增加,导致系统的复杂度随之增加;
· 客户端必须知道策略类有哪些,在运行时还需要配置策略;
· 若策略的变化频繁,可能会导致管理的复杂度提高;
适用场景:
· 系统有多种算法需要进行相互切换;
· 需要避免上下文写大量的if/else语句;
· 算法需要独立封装并对外进行扩展开放;
举例场景:
· 电商折扣策略;
· 支付方式策略;
· 排序算法策略;
【设计模式】策略模式
大飞pkz2025-09-29 20:28
相关推荐
微风中的麦穗8 小时前
【MATLAB】MATLAB R2025a 详细下载安装图文指南:下一代科学计算与工程仿真平台2601_949146538 小时前
C语言语音通知API示例代码:基于标准C的语音接口开发与底层调用实践开源技术8 小时前
Python Pillow 优化,打开和保存速度最快提高14倍学嵌入式的小杨同学8 小时前
从零打造 Linux 终端 MP3 播放器!用 C 语言实现音乐自由mftang10 小时前
Python 字符串拼接成字节详解jasligea10 小时前
构建个人智能助手kokunka10 小时前
【源码+注释】纯C++小游戏开发之射击小球游戏Traced back11 小时前
WinForms 线程安全三剑客详解喵叔哟11 小时前
05-LINQ查询语言入门云栖梦泽11 小时前
易语言开发从入门到精通:补充篇·网络编程进阶+实用爬虫开发·API集成·代理IP配置·异步请求·防封禁优化