步步为营 .NET 设计模式学习笔记 三、Strategy(策略模式)
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)
Context(应用场景):
1、需要使用ConcreteStrategy提供的算法。
2、 内部维护一个Strategy的实例。
3、 负责动态设置运行时Strategy具体的实现算法。
4、负责跟Strategy之间的交互和数据传递。
Strategy(抽象策略类):
1、 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
ConcreteStrategy(具体策略类):
Context(应用场景):
1、需要使用ConcreteStrategy提供的算法。
2、 内部维护一个Strategy的实例。
3、 负责动态设置运行时Strategy具体的实现算法。
4、负责跟Strategy之间的交互和数据传递。
Strategy(抽象策略类):
1、 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
ConcreteStrategy(具体策略类):
2、 实现了Strategy定义的接口,提供具体的算法实现。
现在我以一个我们买电脑时电脑配置装机为示例做个Strategy模式:
先看个用例图:

首先新建Computer.cs:
public abstract class Computer { public abstract string MainBoard(); public abstract string Cpu(); public abstract string PhenoType(); public abstract string Memory(); public abstract string HardDisk(); public abstract string Display(); } |
然后新建lenovo.cs:
public class lenovo:Computer { public override string MainBoard() { return "华硕880G系列" ; } public override string Cpu() { return "闪龙双核180(2.4GHz)" ; } public override string PhenoType() { return "集成高性能显卡" ; } public override string Memory() { return "1G DDRIII" ; } public override string HardDisk() { return "500G" ; } public override string Display() { return "19寸宽屏液晶显示器" ; } } |
然后再建HP.cs:
public class HP:Computer { public override string MainBoard() { return "ATI RS482" ; } public override string Cpu() { return "速龙 64位 x2 双核5000+" ; } public override string PhenoType() { return "NV G310 512M" ; } public override string Memory() { return "2G DDR2 667 " ; } public override string HardDisk() { return "3200G" ; } public override string Display() { return "19寸宽屏液晶显示器" ; } } |
然后再新建个买电脑的类BuyComputer.cs:
public class BuyComputer { private Computer _computer; public BuyComputer(Computer computer) { _computer = computer; } public string ShowComputerConfigure() { StringBuilder strCom = new StringBuilder(); strCom.AppendLine( "你的电脑配置如下:" ); strCom.AppendLine( "主板是:" + _computer.MainBoard()); strCom.AppendLine( "处理器是:" + _computer.Cpu()); strCom.AppendLine( "显卡是:" + _computer.PhenoType()); strCom.AppendLine( "内存是:" + _computer.Memory()); strCom.AppendLine( "硬盘是:" + _computer.HardDisk()); strCom.AppendLine( "显示器是:" + _computer.Display()); strCom.AppendLine( "己组装完成" ); return strCom.ToString(); } } |
然后调用它:
public partial class Run : Form { public Run() { InitializeComponent(); } private void btnRun_Click( object sender, EventArgs e) { BuyComputer myBuy = new BuyComputer( new lenovo()); rtbResult.AppendText(myBuy.ShowComputerConfigure()); myBuy = new BuyComputer( new HP()); rtbResult.AppendText(myBuy.ShowComputerConfigure()); } } |
运行结果如下:
你的电脑配置如下:
主板是:华硕880G系列
处理器是:闪龙双核180(2.4GHz)
显卡是:集成高性能显卡
内存是:1G DDRIII
硬盘是:500G
显示器是:19寸宽屏液晶显示器
己组装完成
你的电脑配置如下:
主板是:ATI RS482
处理器是:速龙 64位 x2 双核5000+
显卡是:NV G310 512M
内存是:2G DDR2 667
硬盘是:3200G
显示器是:19寸宽屏液晶显示器
己组装完成
总结:策略模式和抽象工厂模式很象,区别在于策略模式多了一个统一的接口类,这里是BuyComputer.
欢迎拍砖.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架