• 二十四种设计模式:状态模式(State Pattern)


    状态模式(State Pattern)


    介绍
    允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。


    示例
    有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库中或Xml文件里。在对象内部可以根据用户的不同选择不同的数据持久化方案。

      MessageModel

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Pattern.State
    {
        /// <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; }
            }
        }
    }
    

      AbstractMessageState

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Pattern.State
    {
        /// <summary>
        /// 状态模式抽象类
        /// </summary>
        public abstract class AbstractMessageState
        {
            /// <summary>
            /// Context类型
            /// </summary>
            protected Message _message;
    
            /// <summary>
            /// Context类型属性
            /// </summary>
            public Message Message
            {
                get { return _message; }
                set { _message = value; }
            }
    
            /// <summary>
            /// 改变状态
            /// </summary>
            public abstract void StateChangeCheck();
    
            /// <summary>
            /// 获取Message
            /// </summary>
            /// <returns></returns>
            public abstract List<MessageModel> Get();
    
            /// <summary>
            /// 插入Message
            /// </summary>
            /// <param name="mm">Message实体对象</param>
            /// <returns></returns>
            public abstract bool Insert(MessageModel mm);
        }
    }
    

      XmlMessage

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Pattern.State
    {
        /// <summary>
        /// Xml方式操作Message
        /// </summary>
        public class XmlMessage : AbstractMessageState
        {
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="message">Context类型参数</param>
            public XmlMessage(Message message)
            {
                this._message = message;
            }
    
            /// <summary>
            /// 改变状态
            /// </summary>
            public override void StateChangeCheck()
            {
                // 如果UserId是admin则变换状态为SqlMessage
                if (this._message.UserId == "admin")
                {
                    this._message.AbstractMessageState = new SqlMessage(this._message);
                }
            }
    
            /// <summary>
            /// 获取Message
            /// </summary>
            /// <returns></returns>
            public override 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 override bool Insert(MessageModel mm)
            {
                // 代码略
                return true;
            }
        }
    }
    

      SqlMessage

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Pattern.State
    {
        /// <summary>
        /// Sql方式操作Message
        /// </summary>
        public class SqlMessage : AbstractMessageState
        {
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="message">Context类型参数</param>
            public SqlMessage(Message message)
            {
                this._message = message;
            }
    
            /// <summary>
            /// 改变状态
            /// </summary>
            public override void StateChangeCheck()
            {
    
            }
    
            /// <summary>
            /// 获取Message
            /// </summary>
            /// <returns></returns>
            public override 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 override bool Insert(MessageModel mm)
            {
                // 代码略
                return true;
            }
        }
    }
    

      Message

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Pattern.State
    {
        /// <summary>
        /// Context类
        /// </summary>
        public class Message
        {
            /// <summary>
            /// 类型为状态模式抽象类的私有变量
            /// </summary>
            private AbstractMessageState _abstractMessageState;
    
            /// <summary>
            /// 类型为状态模式抽象类的属性
            /// </summary>
            public AbstractMessageState AbstractMessageState
            {
                get { return _abstractMessageState; }
                set { _abstractMessageState = value; }
            }       
    
            /// <summary>
            /// UserId私有变量
            /// </summary>
            private string _userId;
    
            /// <summary>
            /// UserId
            /// </summary>
            public string UserId
            {
                get { return _userId; }
                set { _userId = value; }
            }
    
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="userId">UserId</param>
            public Message(string userId)
            {
                this._userId = userId;
    
                _abstractMessageState = new XmlMessage(this);
            }
    
            /// <summary>
            /// 获取Message
            /// </summary>
            /// <returns></returns>
            public List<MessageModel> Get()
            {
                // 修改状态
                _abstractMessageState.StateChangeCheck();
    
                return _abstractMessageState.Get();
            }
    
            /// <summary>
            /// 插入Message
            /// </summary>
            /// <param name="mm">Message实体对象</param>
            /// <returns></returns>
            public bool Insert(MessageModel mm)
            {
                // 修改状态
                _abstractMessageState.StateChangeCheck();
    
                return _abstractMessageState.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.State;
    
    public partial class State : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Message m = new Message("admin");
            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("user");
            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
      SQL方式获取Message 2007-3-6 22:58:17
      True
      XML方式获取Message 2007-3-6 22:58:17

  • 相关阅读:
    win7网络共享原来如此简单,WiFi共享精灵开启半天都弱爆了!
    JQUERY UI Datepicker Demo
    Official online document, install svn server in centOS
    JAVE not work in linux
    AMR 转mp3 失败
    XD, XR, DR 股票
    Linux 下MySql 重置密码
    Difinition Of Done
    Apache, Tomcat, JK Configuration Example
    Linux 安装tomcat
  • 原文地址:https://www.cnblogs.com/taotaodetuer/p/6183069.html
Copyright © 2020-2023  润新知