乐在其中设计模式(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)的更多相关文章
- 二十四种设计模式:状态模式(State Pattern)
状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...
- [设计模式] 20 状态模式 State Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对状态模式是这样说的:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.状态模式的重点在于状态转换,很多时候,对 ...
- 【UE4 设计模式】状态模式 State Pattern
概述 描述 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类. 其别名为状态对象(Objects for States),状态模式是一种对象行为型模式. 有限状态机(FSMs) ...
- 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)
原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...
- 【转】设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 乐在其中设计模式(C#) - 提供者模式(Provider Pattern)
原文:乐在其中设计模式(C#) - 提供者模式(Provider Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 提供者模式(Provider Pattern) 作者:weba ...
- 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)
原文:乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) 作者:webabc ...
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...
随机推荐
- 黑马程序员:Java基础总结----类加载器
黑马程序员:Java基础总结 类加载器 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...
- 跨域GET、POST请求
跨域GET.POST请求的小结 重点:跨域POST大量数据: JQuery:$.ajax/$.getJSON支持jsonp格式的跨域,但是只支持GET方式,暂不支持POST: CORS:w3c关于跨域 ...
- selenium让人摸不着头脑的问题
selenium让人摸不着头脑的问题 问题一 使用webdriver驱动firefox浏览器时如果不设置参数,默认使用的Firefox的profile和平时打开浏览器使用的firefox不一样,如果要 ...
- Docker 用法总结之:管理工具 shipyard 的具体使用指南
Docker 的命令行就已经非常好用了,假设非要加上基于 Web 的管理界面的话也有一些选择,如 DockerUI (Angular.js), Dockland (Ruby), Shipyard (P ...
- dblink如果很慢可以用这种方式优化
发现dblink如果很慢可以用这种方式加个/*+driving_site(xxx)*/,查询很快 DBLINK HINT /*+ driving_site(org) */ 优化策略和思路 使用DBLI ...
- NET工厂模式架构
NET工厂模式架构 最近项目的架构需要做调整优化,根据业务需要写了一个简单的工厂模式架构 项目介绍:整个系统分为三大平台(这里用A,B,C来标示),每个平台又细分为多个APP客户端(每个APP都有ap ...
- GridView的RowDataBound事件中获取当前行内容的几种方法
1. Cells[x].Txt. 从列单元格的文本值获取.这种方法简单高率,最为常用,但是功能单纯.此法存在几个缺点: (1)无法获取到设置了隐藏属性的数据列的值,所取到的值为“”(空). ...
- java nio-理解同步、异步,阻塞和非阻塞
理解同步.异步,阻塞和非阻塞 结论:阻塞.非阻塞与是否同步异步无关. 转自知乎 “阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解, ...
- CC ANUMLA(STL的运用)
题目连接:http://www.codechef.com/problems/ANUMLA 题意:给一个序列所有子集和(2^n个子集),复原这个序列... 如:0 1 1 2 2 3 3 4 原序列为1 ...
- mysql-merge合并表
merge表 注意: 1 每个子表的结构必须一致,主表和子表的结构需要一致, 2 每个子表的索引在merge表中都会存在,所以在merge表中不能根据该索引进行唯一性检索. 3 子表需要是MyISAM ...