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

[索引页][源码下载]

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

作者: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()[].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()[].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

[源码下载]