二十四种设计模式:状态模式(State Pattern)
状态模式(State Pattern)
介绍
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
示例
有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库中或Xml文件里。在对象内部可以根据用户的不同选择不同的数据持久化方案。
MessageModel
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.State
{
///
/// Message实体类
///
public class MessageModel
{
///
/// 构造函数
///
/// Message内容
/// Message发布时间
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
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.State
{
///
/// 状态模式抽象类
///
public abstract class AbstractMessageState
{
///
/// Context类型
///
protected Message _message;
///
/// Context类型属性
///
public Message Message
{
get { return _message; }
set { _message = value; }
}
///
/// 改变状态
///
public abstract void StateChangeCheck();
///
/// 获取Message
///
///
public abstract List Get();
///
/// 插入Message
///
/// Message实体对象
///
public abstract bool Insert(MessageModel mm);
}
}
XmlMessage
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.State
{
///
/// Xml方式操作Message
///
public class XmlMessage : AbstractMessageState
{
///
/// 构造函数
///
/// Context类型参数
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);
}
}
///
/// 获取Message
///
///
public override List Get()
{
List l = new List();
l.Add(new MessageModel("XML方式获取Message", DateTime.Now));
return l;
}
///
/// 插入Message
///
/// Message实体对象
///
public override bool Insert(MessageModel mm)
{
// 代码略
return true;
}
}
}
SqlMessage
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.State
{
///
/// Sql方式操作Message
///
public class SqlMessage : AbstractMessageState
{
///
/// 构造函数
///
/// Context类型参数
public SqlMessage(Message message)
{
this._message = message;
}
///
/// 改变状态
///
public override void StateChangeCheck()
{
}
///
/// 获取Message
///
///
public override List Get()
{
List l = new List();
l.Add(new MessageModel("SQL方式获取Message", DateTime.Now));
return l;
}
///
/// 插入Message
///
/// Message实体对象
///
public override bool Insert(MessageModel mm)
{
// 代码略
return true;
}
}
}
Message
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.State
{
///
/// 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; }
}
///
/// 构造函数
///
/// UserId
public Message(string userId)
{
this._userId = userId;
_abstractMessageState = new XmlMessage(this);
}
///
/// 获取Message
///
///
public List Get()
{
// 修改状态
_abstractMessageState.StateChangeCheck();
return _abstractMessageState.Get();
}
///
/// 插入Message
///
/// Message实体对象
///
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("
");
Response.Write(m.Get()[0].Message + " " + m.Get()[0].PublishTime.ToString());
Response.Write("
");
m = new Message("user");
Response.Write(m.Insert(new MessageModel("插入", DateTime.Now)));
Response.Write("
");
Response.Write(m.Get()[0].Message + " " + m.Get()[0].PublishTime.ToString());
Response.Write("
");
}
}
运行结果
True
SQL方式获取Message 2007-3-6 22:58:17
True
XML方式获取Message 2007-3-6 22:58:17