设计模式系列漫谈之三 - 策略模式

故事
     
  小雪的生日过得异常热闹,她收到了来自远方的祝福。这些追求者们谁也不示弱,对可爱的小雪大献殷勤,通过各种方式向小雪表达平时根本不敢表达的话语。随着时间一天一天过去,追求小雪的男孩越来越多,追求者们所使用的手机品牌越来越多。善良的小雪不得不面对这些追求者,开弓没有回头箭。小雪开始发现,原来的方法变得越来越复杂。
   工厂类如下:

namespace XiaoXue
{
   
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)角色实现如下:

namespace XiaoXue
{
   
public interface IMessageStrategy
   {
        
void SendMessage(object Msg);
   }
}

环境(Context)角色实现如下:

namespace XiaoXue
{
   
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)角色实现如下:

namespace XiaoXue
{
    
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("小雪,白昼与黑夜都无法阻挡我对你的深深思念");
从上述可以看出,本文开头遇到的麻烦转交给了追求者。但是小雪相信,沉浸在爱情中的这些追求者应该不会有任何怨言吧,哈哈!!

posted @   李华星  阅读(709)  评论(6编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 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的设计模式综述
点击右上角即可分享
微信分享提示