天天看點

樂在其中設計模式(C#) - 狀态模式(State Pattern)

[索引頁]

[×××]

樂在其中設計模式(C#) - 狀态模式(State Pattern)

作者:webabcd

介紹

允許一個對象在其内部狀态改變時改變它的行為。對象看起來似乎修改了它所屬的類。

示例

有一個Message實體類,對它的操作有Insert()和Get()方法,持久化資料在SqlServer資料庫中或Xml檔案裡。在對象内部可以根據使用者的不同選擇不同的資料持久化方案。

樂在其中設計模式(C#) - 狀态模式(State Pattern)

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;

                /// Message内容

                public string Message

                        get { return _message; }

                        set { _message = value; }

                private DateTime _publishTime;

                /// Message釋出時間

                public DateTime PublishTime

                        get { return _publishTime; }

                        set { _publishTime = value; }

        }

}

AbstractMessageState

        /// 狀态模式抽象類

        public abstract class AbstractMessageState

                /// Context類型

                protected Message _message;

                /// Context類型屬性

                public Message Message

                /// 改變狀态

                public abstract void StateChangeCheck();

                /// 擷取Message

                /// <returns></returns>

                public abstract List<MessageModel> Get();

                /// 插入Message

                /// <param name="mm">Message實體對象</param>

                public abstract bool Insert(MessageModel mm);

XmlMessage

        /// Xml方式操作Message

        public class XmlMessage : AbstractMessageState

                /// <param name="message">Context類型參數</param>

                public XmlMessage(Message message)

                        this._message = message;

                public override void StateChangeCheck()

                        // 如果UserId是admin則變換狀态為SqlMessage

                        if (this._message.UserId == "admin")

                        {

                                this._message.AbstractMessageState = new SqlMessage(this._message);

                        }

                public override List<MessageModel> Get()

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

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

                        return l;

                public override bool Insert(MessageModel mm)

                        // 代碼略

                        return true;

SqlMessage

        /// Sql方式操作Message

        public class SqlMessage : AbstractMessageState

                public SqlMessage(Message message)

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

Message

        /// Context類

        public class Message

                /// 類型為狀态模式抽象類的私有變量

                private AbstractMessageState _abstractMessageState;

                /// 類型為狀态模式抽象類的屬性

                public AbstractMessageState AbstractMessageState

                        get { return _abstractMessageState; }

                        set { _abstractMessageState = value; }

                }                

                /// UserId私有變量

                private string _userId;

                /// UserId

                public string UserId

                        get { return _userId; }

                        set { _userId = value; }

                /// <param name="userId">UserId</param>

                public Message(string userId)

                        this._userId = userId;

                        _abstractMessageState = new XmlMessage(this);

                public List<MessageModel> Get()

                        // 修改狀态

                        _abstractMessageState.StateChangeCheck();

                        return _abstractMessageState.Get();

                public bool Insert(MessageModel mm)

                        return _abstractMessageState.Insert(mm);

client

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());

                m = new Message("user");

運作結果

True

SQL方式擷取Message 2007-3-6 22:58:17

XML方式擷取Message 2007-3-6 22:58:17

參考

http://www.dofactory.com/Patterns/PatternState.aspx

OK

繼續閱讀