设计模式 - State Pattern(状态模式)

本文介绍状态模式的概念,并通过一个具体的应用实例展示如何使用状态模式来实现对象行为随内部状态变化而变化的功能。示例中,根据用户的类型选择不同的数据持久化方式。

设计模式 - State Pattern(状态模式)  

[源码下载]

设计模式 - State Pattern(状态模式)

作者:webabcd 介绍 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。 示例 有一个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 OK [源码下载]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值