现在的位置: 首页 > 综合 > 正文

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

2012年12月09日 ⁄ 综合 ⁄ 共 2953字 ⁄ 字号 评论关闭

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

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

抱歉!评论已关闭.