设计模式系列漫谈之三 - 策略模式
故事
小雪的生日过得异常热闹,她收到了来自远方的祝福。这些追求者们谁也不示弱,对可爱的小雪大献殷勤,通过各种方式向小雪表达平时根本不敢表达的话语。随着时间一天一天过去,追求小雪的男孩越来越多,追求者们所使用的手机品牌越来越多。善良的小雪不得不面对这些追求者,开弓没有回头箭。小雪开始发现,原来的方法变得越来越复杂。
工厂类如下:
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;
}
}
}
{
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);
}
}
{
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);
}
}
}
{
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短信;
}
}
}
{
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("小雪,白昼与黑夜都无法阻挡我对你的深深思念");
从上述可以看出,本文开头遇到的麻烦转交给了追求者。但是小雪相信,沉浸在爱情中的这些追求者应该不会有任何怨言吧,哈哈!!