设计模式系列漫谈之三 - 策略模式
故事
小雪的生日过得异常热闹,她收到了来自远方的祝福。这些追求者们谁也不示弱,对可爱的小雪大献殷勤,通过各种方式向小雪表达平时根本不敢表达的话语。随着时间一天一天过去,追求小雪的男孩越来越多,追求者们所使用的手机品牌越来越多。善良的小雪不得不面对这些追求者,开弓没有回头箭。小雪开始发现,原来的方法变得越来越复杂。
工厂类如下:
{
internal class MessageFactory
{
internal static IMessage CreateMessage(string Type)
{
IMessage message= null;
switch (Type)
{
case "NOKIA":
message = new NOKIA();
break;
case "MOTOROLA":
message = new MOTOROLA();
break;
case "SANSUNG":
message = new SANSUNG();
break;
case "SIEMENS":
message = new SIEMENS();
break;
case "ERICSSION":
message = new ERICSSION();
break;
case "LENOVO":
message = new LENOVO();
break;
case "PHILIPS":
message = new PHILIPS();
break;
.
.
.
.
.
.
}
return message;
}
}
}
看着这无限制的CASE,原来轻巧的方法变得越来越笨重,更何况以后还会有出现更多的手机类型。面对上述问题,小雪一筹莫展。
让我们来看看,上述存在的核心主要是不同手机类型有不同的发送方法(策略)。
策略模式(Strategy)的解决方案:
策略模式涉及到三个角色:
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
环境(Context)角色:持有一个Strategy类的引用。
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
抽象策略(Strategy)角色实现如下:
{
public interface IMessageStrategy
{
void SendMessage(object Msg);
}
}
环境(Context)角色实现如下:
{
public class MessageContext
{
IMessageStrategy messageClassStrategy = null;
public void setStrategy(IMessageStrategy message)
{
this.messageStrategy = message;
}
public void SendMessage(object msg)
{
return this.messageStrategy.SendMessage(object msg);
}
}
}
具体策略(ConcreteStrategy)角色实现如下:
{
public class NOKIA : IMessageStrategy
{
public void SendMessage(object msg)
{
//发送NOKIA短信;
}
}
public class MOTOROLA : IMessageStrategy
{
public void SendMessage(object msg)
{
//发送MOTOROLA短信;
}
}
public class SANSUNG : IMessageStrategy
{
public void SendMessage(object msg)
{
//发送SANSUNG短信;
}
}
public class SIEMENS : IMessageStrategy
{
public void SendMessage(object msg)
{
//发送SIEMENS短信;
}
}
public class ERICSSION : IMessageStrategy
{
public void SendMessage(object msg)
{
//发送ERICSSION短信;
}
}
}
通过策略模式,使用Nokia手机的追求者的发送短信的方法如下:
MessageContext messageContext=new MessageContext();
messageContext.setStrategy(new NOKIA());
messageContext.SendMessage("小雪,白昼与黑夜都无法阻挡我对你的深深思念");
从上述可以看出,本文开头遇到的麻烦转交给了追求者。但是小雪相信,沉浸在爱情中的这些追求者应该不会有任何怨言吧,哈哈!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述