• 乐在其中设计模式(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()[
    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
    [源码下载] 
  • 相关阅读:
    让资源管理器不显示最近常用文件夹
    票房实际是屌丝血
    为什么读了很多书,还是过不好这一生?
    抱怨就像呕吐
    finally关键字小复习
    Java中菜单组件
    Java的GUI窗体出现乱码解决方法
    Java中GUI的默认窗体布局 和 常见的窗体布局方案
    适配器类(便利类)的由来:当你自己写的类中想用某个接口中个别方法的时候(注意:不是所有的方法),肿么办?
    技术管理者工作成效评估表
  • 原文地址:https://www.cnblogs.com/webabcd/p/647148.html
Copyright © 2020-2023  润新知