[索引页]
[源码下载]

乐在其中设计模式(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()[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

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

OK
[源码下载]

本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/344585,如需转载请自行联系原作者
 

乐在其中设计模式(C#) - 状态模式(State Pattern)相关推荐

  1. php 状态模式,PHP设计模式(十九)—状态模式 (State Pattern)

    状态模式 (State Pattern) :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类.其别名为状态对象(Objects for States) (一)为什么需要状态模式 ...

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

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

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

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

  4. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...

  5. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  6. 设计模式之状态模式(State)

    什么是状态? 我们在购物网站进行购物时,订单会产生几种状况:已下单.已付款.送货中.确定收货等状态. 所以系统会判断该订单的状态,不管是哪种状态都应给出对应的操作,这就是状态. 什么是状态模式? 在软 ...

  7. 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)

    说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对"状态模式"并不陌生,因为我们之前使用到了状态模式进行 ...

  8. 极速理解设计模式系列:22.状态模式(State Pattern)

    四个角色:抽象状态类(State).具体状态类(ConcreateState).情景类(Context).客户端(Client) 抽象状态类(State):提供一个与情景类有关的State行为. 具体 ...

  9. 设计模式之状态模式(State)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  10. C++设计模式之状态模式(state)(行为型)

    一 定义 状态模式:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况.把不同状态的操作分散到不同的状态对象 ...

最新文章

  1. mysql 查询二维数组_sql数据库查询结果存入二维数组,结果都是0?求帮助
  2. 使用valgrind检测内存问题
  3. 作者:胡卫生(1964-),男,博士,上海交通大学教授、博士生导师,主要研究方向为下一代光接入网、光交换、光网络等。...
  4. 【nginx】【小记】泛解析大量域名的情况下 将不带www的域名,301到与之对应的www前缀的域名
  5. xocodebulid 自动化打包 解决提示 ld: library not found for -lPods 问题
  6. 招贤纳士|360WEB平台云平台部招人啦
  7. python编程遍历_Python字典遍历操作实例小结
  8. kafka集群为什么需要三个节点_Kafka突然宕机了?稳住,莫慌!
  9. x86体系Linux内核进程切换原理(64位和32位)
  10. matlab软件topsis分析,基于AHP—TOPSIS的渗透测试工具的综合评价方法与流程
  11. FLASH透明背景代码大全
  12. android 越来越慢,为什么安卓手机总是越用越慢?怎么...
  13. 据说百度的月饼最差劲!!
  14. 企业微信机器人记录2
  15. sql server 经典练习题分享二
  16. php 图片上添加文字
  17. Python从入门到实战,我觉着拥有这三本书很有必要
  18. 干货|JustAuth三方账号授权登录免费搭建全流程
  19. 谷粒商城笔记+踩坑(18)——购物车
  20. 第一部分 数理逻辑 第三章 命题逻辑的推理理论

热门文章

  1. 科技公司亚马逊名字由来_名字叫什么? 为什么亚马逊的“认可”是可爱营销的灾难性尝试
  2. 如何将java项目部署到Linux服务器上
  3. 九度教程第28题-堆栈的的使用(栈的使用)
  4. FPGA IP核分类
  5. Python 核心编程 (全)
  6. 自定义Toast的出现样式
  7. spring StopWatch用法
  8. Codeforces Round #387 (Div. 2) 747E
  9. 我对javascript面向对象编程的理解---------继承
  10. POJ 2976 裸的01分数规划