您的位置:首页 > 编程语言 > C#

乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

2007-02-10 22:48 633 查看
[索引页]
[源码下载]

[align=center]乐在其中设计模式(C#) - 策略模式(Strategy Pattern)[/align]

作者:webabcd

介绍
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。

示例
有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库中或Xml文件里(两种可互换的算法)。由客户端决定使用哪种算法。



MessageModel


using System;


using System.Collections.Generic;


using System.Text;




namespace Pattern.Strategy


{


/// <summary>


/// Message实体类


/// </summary>


public class MessageModel


{


/// <summary>


/// 构造函数


/// </summary>


/// <param name="msg">Message内容</param>


/// <param name="pt">Message发布时间</param>


public MessageModel(string msg, DateTime pt)


{


this._message = msg;


this._publishTime = pt;


}




private string _message;


/// <summary>


/// Message内容


/// </summary>


public string Message


{


get { return _message; }


set { _message = value; }


}




private DateTime _publishTime;


/// <summary>


/// Message发布时间


/// </summary>


public DateTime PublishTime


{


get { return _publishTime; }


set { _publishTime = value; }


}


}


}

IMessageStrategy


using System;


using System.Collections.Generic;


using System.Text;




namespace Pattern.Strategy


{


/// <summary>


/// 策略接口


/// </summary>


public interface IMessageStrategy


{


/// <summary>


/// 获取Message


/// </summary>


/// <returns></returns>


List<MessageModel> Get();




/// <summary>


/// 插入Message


/// </summary>


/// <param name="mm">Message实体对象</param>


/// <returns></returns>


bool Insert(MessageModel mm);


}


}

SqlMessage


using System;


using System.Collections.Generic;


using System.Text;




namespace Pattern.Strategy


{


/// <summary>


/// Sql方式操作Message


/// </summary>


public class SqlMessage : IMessageStrategy


{


/// <summary>


/// 获取Message


/// </summary>


/// <returns></returns>


public List<MessageModel> Get()


{


List<MessageModel> l = new List<MessageModel>();


l.Add(new MessageModel("SQL方式获取Message", DateTime.Now));




return l;


}




/// <summary>


/// 插入Message


/// </summary>


/// <param name="mm">Message实体对象</param>


/// <returns></returns>


public bool Insert(MessageModel mm)


{


// 代码略


return true;


}


}


}

XmlMessage


using System;


using System.Collections.Generic;


using System.Text;




namespace Pattern.Strategy


{


/// <summary>


/// Xml方式操作Message


/// </summary>


public class XmlMessage : IMessageStrategy


{


/// <summary>


/// 获取Message


/// </summary>


/// <returns></returns>


public List<MessageModel> Get()


{


List<MessageModel> l = new List<MessageModel>();


l.Add(new MessageModel("XML方式获取Message", DateTime.Now));




return l;


}




/// <summary>


/// 插入Message


/// </summary>


/// <param name="mm">Message实体对象</param>


/// <returns></returns>


public bool Insert(MessageModel mm)


{


// 代码略


return true;


}


}


}

Message


using System;


using System.Collections.Generic;


using System.Text;




namespace Pattern.Strategy


{


/// <summary>


/// Context类


/// </summary>


public class Message


{


/// <summary>


/// 声明一个IMessageStrategy类型


/// </summary>


private IMessageStrategy _strategy;




/// <summary>


/// 构造函数


/// </summary>


/// <param name="strategy">具体算法</param>


public Message(IMessageStrategy strategy)


{


this._strategy = strategy;


}




/// <summary>


/// 获取Message


/// </summary>


/// <returns></returns>


public List<MessageModel> Get()


{


return _strategy.Get();


}




/// <summary>


/// 插入Message


/// </summary>


/// <param name="mm">Message实体对象</param>


/// <returns></returns>


public bool Insert(MessageModel mm)


{


return _strategy.Insert(mm);


}


}


}

client


using System;


using System.Data;


using System.Configuration;


using System.Collections;


using System.Web;


using System.Web.Security;


using System.Web.UI;


using System.Web.UI.WebControls;


using System.Web.UI.WebControls.WebParts;


using System.Web.UI.HtmlControls;




using Pattern.Strategy;




public partial class Strategy : System.Web.UI.Page


{


protected void Page_Load(object sender, EventArgs e)


{


Message m = new Message(new XmlMessage());


Response.Write(m.Insert(new MessageModel("插入", DateTime.Now)));


Response.Write("<br />");


Response.Write(m.Get()[0].Message + " " + m.Get()[0].PublishTime.ToString());


Response.Write("<br />");




m = new Message(new SqlMessage());


Response.Write(m.Insert(new MessageModel("插入", DateTime.Now)));


Response.Write("<br />");


Response.Write(m.Get()[0].Message + " " + m.Get()[0].PublishTime.ToString());


Response.Write("<br />");


}


}

运行结果
True
XML方式获取Message 2007-2-10 22:42:44
True
SQL方式获取Message 2007-2-10 22:42:44

参考
http://www.dofactory.com/Patterns/PatternStrategy.aspx

OK
[源码下载]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息