[索引页] [源码下载]

乐在当中设计情势(C#) – 状态形式(State Pattern)

作者:webabcd

介绍
同意一个目的在在那之中间景观改变时改变它的一坐一起。对象看起来如同修改了它所属的类。

示例
有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库中或Xml文件里。在指标内部能够依照用户的不等接纳区别的多少持久化方案。
图片 1

MessageModel

图片 2using System;
图片 3using System.Collections.Generic;
图片 4using System.Text;
图片 5
图片 6namespace Pattern.State
图片 7图片 8图片 9{
图片 10图片 11    /**//// <summary>
图片 12    /// Message实体类
图片 13    /// </summary>
图片 14    public class MessageModel
图片 15图片 16    图片 17{
图片 18图片 19        /**//// <summary>
图片 20        /// 构造函数
图片 21        /// </summary>
图片 22        /// <param name=”msg”>Message内容</param>
图片 23        /// <param name=”pt”>Message公布时间</param>
图片 24        public MessageModel(string msg, DateTime pt)
图片 25图片 26        图片 27{
图片 28            this._message = msg;
图片 29            this._publishTime = pt;
图片 30        }
图片 31
图片 32        private string _message;
图片 33图片 34        /**//// <summary>
图片 35        /// Message内容
图片 36        /// </summary>
图片 37        public string Message
图片 38图片 39        图片 40{
图片 41图片 42            get 图片 43{ return _message; }
图片 44图片 45            set 图片 46{ _message = value; }
图片 47        }
图片 48
图片 49        private DateTime _publishTime;
图片 50图片 51        /**//// <summary>
图片 52        /// Message揭橥时间
图片 53        /// </summary>
图片 54        public DateTime PublishTime
图片 55图片 56        图片 57{
图片 58图片 59            get 图片 60{ return _publishTime; }
图片 61图片 62            set 图片 63{ _publishTime = value; }
图片 64        }
图片 65    }
图片 66}
图片 67

AbstractMessageState

图片 68using System;
图片 69using System.Collections.Generic;
图片 70using System.Text;
图片 71
图片 72namespace Pattern.State
图片 73图片 74图片 75{
图片 76图片 77    /**//// <summary>
图片 78    /// 状态格局抽象类
图片 79    /// </summary>
图片 80    public abstract class AbstractMessageState
图片 81图片 82    图片 83{
图片 84图片 85        /**//// <summary>
图片 86        /// Context类型
图片 87        /// </summary>
图片 88        protected Message _message;
图片 89
图片 90图片 91        /**//// <summary>
图片 92        /// Context类型属性
图片 93        /// </summary>
图片 94        public Message Message
图片 95图片 96        图片 97{
图片 98图片 99            get 图片 100{ return _message; }
图片 101图片 102            set 图片 103{ _message = value; }
图片 104        }
图片 105
图片 106图片 107        /**//// <summary>
图片 108        /// 改变状态
图片 109        /// </summary>
图片 110        public abstract void StateChangeCheck();
图片 111
图片 112图片 113        /**//// <summary>
图片 114        /// 获取Message
图片 115        /// </summary>
图片 116        /// <returns></returns>
图片 117        public abstract List<MessageModel> Get();
图片 118
图片 119图片 120        /**//// <summary>
图片 121        /// 插入Message
图片 122        /// </summary>
图片 123        /// <param name=”mm”>Message实体对象</param>
图片 124        /// <returns></returns>
图片 125        public abstract bool Insert(MessageModel mm);
图片 126    }
图片 127}
图片 128

XmlMessage

图片 129using System;
图片 130using System.Collections.Generic;
图片 131using System.Text;
图片 132
图片 133namespace Pattern.State
图片 134图片 135图片 136{
图片 137图片 138    /**//// <summary>
图片 139    /// Xml格局操作Message
图片 140    /// </summary>
图片 141    public class XmlMessage : AbstractMessageState
图片 142图片 143    图片 144{
图片 145图片 146        /**//// <summary>
图片 147        /// 构造函数
图片 148        /// </summary>
图片 149        /// <param name=”message”>Context类型参数</param>
图片 150        public XmlMessage(Message message)
图片 151图片 152        图片 153{
图片 154            this._message = message;
图片 155        }
图片 156
图片 157图片 158        /**//// <summary>
图片 159        /// 改变状态
图片 160        /// </summary>
图片 161        public override void StateChangeCheck()
图片 162图片 163        图片 164{
图片 165            // 假设UserId是admin则转移状态为SqlMessage
图片 166            if (this._message.UserId == “admin”)
图片 167图片 168            图片 169{
图片 170                this._message.AbstractMessageState = new SqlMessage(this._message);
图片 171            }
图片 172        }
图片 173
图片 174图片 175        /**//// <summary>
图片 176        /// 获取Message
图片 177        /// </summary>
图片 178        /// <returns></returns>
图片 179        public override List<MessageModel> Get()
图片 180图片 181        图片 182{
图片 183            List<MessageModel> l = new List<MessageModel>();
图片 184            l.Add(new MessageModel(“XML形式赢得Message”, Date提姆e.Now));
图片 185
图片 186            return l;
图片 187        }
图片 188
图片 189图片 190        /**//// <summary>
图片 191        /// 插入Message
图片 192        /// </summary>
图片 193        /// <param name=”mm”>Message实体对象</param>
图片 194        /// <returns></returns>
图片 195        public override bool Insert(MessageModel mm)
图片 196图片 197        图片 198{
图片 199            // 代码略
图片 200            return true;
图片 201        }
图片 202    }
图片 203}
图片 204

SqlMessage

图片 205using System;
图片 206using System.Collections.Generic;
图片 207using System.Text;
图片 208
图片 209namespace Pattern.State
图片 210图片 211图片 212{
图片 213图片 214    /**//// <summary>
图片 215    /// Sql格局操作Message
图片 216    /// </summary>
图片 217    public class SqlMessage : AbstractMessageState
图片 218图片 219    图片 220{
图片 221图片 222        /**//// <summary>
图片 223        /// 构造函数
图片 224        /// </summary>
图片 225        /// <param name=”message”>Context类型参数</param>
图片 226        public SqlMessage(Message message)
图片 227图片 228        图片 229{
图片 230            this._message = message;
图片 231        }
图片 232
图片 233图片 234        /**//// <summary>
图片 235        /// 改变状态
图片 236        /// </summary>
图片 237        public override void StateChangeCheck()
图片 238图片 239        图片 240{
图片 241
图片 242        }
图片 243
图片 244图片 245        /**//// <summary>
图片 246        /// 获取Message
图片 247        /// </summary>
图片 248        /// <returns></returns>
图片 249        public override List<MessageModel> Get()
图片 250图片 251        图片 252{
图片 253            List<MessageModel> l = new List<MessageModel>();
图片 254            l.Add(new MessageModel(“SQL方式赢得Message”, DateTime.Now));
图片 255
图片 256            return l;
图片 257        }
图片 258
图片 259图片 260        /**//// <summary>
图片 261        /// 插入Message
图片 262        /// </summary>
图片 263        /// <param name=”mm”>Message实体对象</param>
图片 264        /// <returns></returns>
图片 265        public override bool Insert(MessageModel mm)
图片 266图片 267        图片 268{
图片 269            // 代码略
图片 270            return true;
图片 271        }
图片 272    }
图片 273}
图片 274

Message

图片 275using System;
图片 276using System.Collections.Generic;
图片 277using System.Text;
图片 278
图片 279namespace Pattern.State
图片 280图片 281图片 282{
图片 283图片 284    /**//// <summary>
图片 285    /// Context类
图片 286    /// </summary>
图片 287    public class Message
图片 288图片 289    图片 290{
图片 291图片 292        /**//// <summary>
图片 293        /// 类型为状态情势抽象类的民用变量
图片 294        /// </summary>
图片 295        private AbstractMessageState _abstractMessageState;
图片 296
图片 297图片 298        /**//// <summary>
图片 299        /// 类型为状态情势抽象类的性情
图片 300        /// </summary>
图片 301        public AbstractMessageState AbstractMessageState
图片 302图片 303        图片 304{
图片 305图片 306            get 图片 307{ return _abstractMessageState; }
图片 308图片 309            set 图片 310{ _abstractMessageState = value; }
图片 311        }       
图片 312
图片 313图片 314        /**//// <summary>
图片 315        /// UserId私有变量
图片 316        /// </summary>
图片 317        private string _userId;
图片 318
图片 319图片 320        /**//// <summary>
图片 321        /// UserId
图片 322        /// </summary>
图片 323        public string UserId
图片 324图片 325        图片 326{
图片 327图片 328            get 图片 329{ return _userId; }
图片 330图片 331            set 图片 332{ _userId = value; }
图片 333        }
图片 334
图片 335图片 336        /**//// <summary>
图片 337        /// 构造函数
图片 338        /// </summary>
图片 339        /// <param name=”userId”>UserId</param>
图片 340        public Message(string userId)
图片 341图片 342        图片 343{
图片 344            this._userId = userId;
图片 345
图片 346            _abstractMessageState = new XmlMessage(this);
图片 347        }
图片 348
图片 349图片 350        /**//// <summary>
图片 351        /// 获取Message
图片 352        /// </summary>
图片 353        /// <returns></returns>
图片 354        public List<MessageModel> Get()
图片 355图片 356        图片 357{
图片 358            // 修改处境
图片 359            _abstractMessageState.StateChangeCheck();
图片 360
图片 361            return _abstractMessageState.Get();
图片 362        }
图片 363
图片 364图片 365        /**//// <summary>
图片 366        /// 插入Message
图片 367        /// </summary>
图片 368        /// <param name=”mm”>Message实体对象</param>
图片 369        /// <returns></returns>
图片 370        public bool Insert(MessageModel mm)
图片 371图片 372        图片 373{
图片 374            // 修改情状
图片 375            _abstractMessageState.StateChangeCheck();
图片 376
图片 377            return _abstractMessageState.Insert(mm);
图片 378        }
图片 379    }
图片 380}
图片 381

client

图片 382using System;
图片 383using System.Data;
图片 384using System.Configuration;
图片 385using System.Collections;
图片 386using System.Web;
图片 387using System.Web.Security;
图片 388using System.Web.UI;
图片 389using System.Web.UI.WebControls;
图片 390using System.Web.UI.WebControls.WebParts;
图片 391using System.Web.UI.HtmlControls;
图片 392
图片 393using Pattern.State;
图片 394
图片 395public partial class State : System.Web.UI.Page
图片 396图片 397图片 398{
图片 399    protected void Page_Load(object sender, EventArgs e)
图片 400图片 401    图片 402{
图片 403        Message m = new Message(“admin”);
图片 404        Response.Write(m.Insert(new MessageModel(“插入”, DateTime.Now)));
图片 405        Response.Write(“<br />”);
图片 406        Response.Write(m.Get()[0].Message + ” ” + m.Get()[0].PublishTime.ToString());
图片 407        Response.Write(“<br />”);
图片 408
图片 409        m = new Message(“user”);
图片 410        Response.Write(m.Insert(new MessageModel(“插入”, DateTime.Now)));
图片 411        Response.Write(“<br />”);
图片 412        Response.Write(m.Get()[0].Message + ” ” + m.Get()[0].PublishTime.ToString());
图片 413        Response.Write(“<br />”);
图片 414    }
图片 415}
图片 416

运作结果
True
SQL方式获得Message 二〇〇七-3-6 22:58:一7
True
XML情势赢得Message 二〇〇六-三-陆 2二:5八:一七

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

OK
[源码下载]

相关文章

网站地图xml地图