步步为营 .NET 设计模式学习笔记 八、State(状态模式)
概述
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。意图
状态模式主要解决的是当控制一个对象状态装换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简单化。
当一个对象行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。
<Design Pattern>State模式结构图
示例关系图
描述: 一年有12个月,有四个季度,每个月都有一属于一个季度,根据月份得到这个季度的天气信息.可以用State模式来实现.
关系图:
代码设计:
先创建接口IQuarter.cs:
view sourceprint?01 public inte易做图ce IQuarter
02 {
03 /// <summary>
04 /// 通过月份获取季度
05 /// </summary>
06 /// <param name="Month"></param>
07 /// <returns></returns>
08 Quarter GetQuarter();
09
10 /// <summary>
11 /// 气候条件
12 /// </summary>
13 /// <returns></returns>
14 string Climate();
15 }
再创建Quarter.cs:
view sourceprint?01 public abstract class Quarter:IQuarter
02 {
03 private int _Month = 0;
04 public int Month
05 {
06 get
07 {
08 return _Month;
09 }
10 set
11 {
12 _Month = value;
13 }
14 }
15 public Quarter(int month )
16 {
17 this.Month = month;
18 }
19
20 #region IQuarter 成员
21
22 public abstract Quarter GetQuarter();
23
24 public abstract string Climate();
25
26 #endregion
27
28
29 }
view sourceprint?1 再创建Spring.cs:
view sourceprint?01 public class Spring : Quarter02 {
03
04 private Quarter quarter;
05 public override string Climate()
06 {
07 return "春风宜人,鸟语花香,正是旅游的好季节。";
08 }
09
10 public override Quarter GetQuarter()
11 {
12 if (Month > 3)
13 {
14 quarter = new Summer(Month);
15 return quarter.GetQuarter();
16 }
17 return new Spring(Month);
18 }
19 public Spring(int month):base(month)
20 {
21
22 }
23 }
再创建Summer.cs:
view sourceprint?01 public class Summer : Quarter
02 {
03 private Quarter quarter;
04 public override string Climate()
05 {
06 return "夏季天气炎热,酷暑难熬.";
07 }
08 public override Quarter GetQuarter()
09 {
10 if (Month < 4)
11 {
12 quarter = new Spring(Month);
13 return quarter.GetQuarter();
14 }
15 if (Month > 6)
16 {
17 quarter = new Autumn(Month);
18 return quarter.GetQuarter();
19 }
20
21 return new Summer(this.Month);
22
23 }
24 public Summer(int month): base(month)
25 {
26
27 }
28 }
再创建 Autumn.cs:
vie
补充:Web开发 , ASP.Net ,