原文:乐在其中设计模式(C#) - 状态模式(State Pattern)

[索引页][源码下载]

乐在其中设计模式(C#) - 状态模式(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()[].PublishTime.ToString());

        Response.Write("<br />");



        m = new Message("user");

        Response.Write(m.Insert(new MessageModel("插入", DateTime.Now)));

        Response.Write("<br />");

        Response.Write(m.Get()[].PublishTime.ToString());

        Response.Write("<br />");

    }

}

运行结果

True

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

True

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





参考

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





OK

[源码下载]

乐在其中设计模式(C#) - 状态模式(State Pattern)的更多相关文章

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

    状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...

  2. [设计模式] 20 状态模式 State Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对状态模式是这样说的:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.状态模式的重点在于状态转换,很多时候,对 ...

  3. 【UE4 设计模式】状态模式 State Pattern

    概述 描述 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类. 其别名为状态对象(Objects for States),状态模式是一种对象行为型模式. 有限状态机(FSMs) ...

  4. 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)

    原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...

  5. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  6. 设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  7. 乐在其中设计模式(C#) - 提供者模式(Provider Pattern)

    原文:乐在其中设计模式(C#) - 提供者模式(Provider Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 提供者模式(Provider Pattern) 作者:weba ...

  8. 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)

    原文:乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) 作者:webabc ...

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

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

随机推荐

  1. curl订单具体解释

    为windows假设用户Cygwin模拟unix环境的话,不会有带curl命令,拥有设备,它建议使用Gow为了模拟,它已经自带curl工具,直接安装之后cmd使用环境curl命令可以,由于路径是自己主 ...

  2. POJ 2826 An Easy Problem?! 好的标题

    受该两块木板以形成槽的效果.Q槽可容纳雨水多,注意雨爆跌,思想是非常easy,分类讨论是有点差. 1.假定两条线段不相交或平行,然后再装0: 2.有一个平行x轴.连衣裙0. 3.若上面覆盖以下的,装0 ...

  3. C++编程命名规范

    原地址:http://www.cnblogs.com/joinclear/archive/2013/02/21/2921422.html C++编程命名规范 0前言 根据多年工作经验和其它命名规范整理 ...

  4. 使用EXCEL设置“下拉菜单”选项功能

    原创作品.出自 "深蓝的blog" 博客.欢迎转载.转载时请务必注明出处,否则有权追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlo ...

  5. hdu1260(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1260 分析:简单dp,dp[i]=min(dp[i-1]+a[i],dp[i-2]); #includ ...

  6. hdu1151 Air Raid,DAG图的最小路径覆盖

    点击打开链接 有向无环图的最小路径覆盖 = 顶点数- 最大匹配 #include <queue> #include <cstdio> #include <cstring& ...

  7. SPARK如何使用AKKA实现进程、节点通信

    SPARK如何使用AKKA实现进程.节点通信 <深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 < ...

  8. jquery下php与ajax的互传数据(json格式)自我总结

    研究了一整天的json数据与ajax的数据传输,现在进行一个小的自我总结,仅供参考 1.关于ajax的认识 $.ajax(),是jquery下包装好的一个函数:参考地址:http://www.w3sc ...

  9. pcie inbound、outbound及EP、RC间的互相訪问

    Inbound:PCI域訪问存储器域 Outbound:存储器域訪问PCI域 RC訪问EP: RC存储器域->outbound->RC PCI域->EP PCI域->inbou ...

  10. 第一章 andrid visdio 安装

    第一章   andrid visdio 安装与环境搭建 一.Android Studio简介 Android Studio是Google新发布的Android应用程序开发环境,Android Stud ...