博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式:状态模式(State Pattern)
阅读量:7038 次
发布时间:2019-06-28

本文共 3173 字,大约阅读时间需要 10 分钟。

作者:  创建于:2012-07-16 出处: 收录于:2013-03-01

结构图


 

意图


允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

适用性


  • 一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。
  • 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常, 有多个操作包含这一相同的条件结构。S t a t e模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。 

实现代码


 

View Code
1 using System; 2     //客户端 3     class Program 4     { 5         static void Main(string[] args) 6         { 7             Context context = new Context(new ConcreteStateA()); 8  9             context.Request();10             context.Request();11             context.Request();12             context.Request();13 14             Console.Read();15         }16     }17 18     public class Context19     {20         private State state;21         public State State22         {23             get { return state; }24             set { state = value; }25         }26         public Context(State state)27         {28             this.state = state;29         }30         public void Request()31         {32             state.Handle(this);33         }34     }35     public abstract class State36     {37         public abstract void Handle(Context context);38     }39 40     public class ConcreteStateA : State41     {42         public override void Handle(Context context)43         {44             Console.WriteLine("当前状态是 A.");45             context.State = new ConcreteStateB();46         }47     }48     public class ConcreteStateB : State49     {50         public override void Handle(Context context)51         {52             Console.WriteLine("当前状态是 B.");53             context.State = new ConcreteStateA();54         }55     }

运行结果:

应用举例

电灯有两个状态,开(亮)与关(不亮),下面就用状态模式来实现对电灯的控制。

 

View Code
1     using System; 2  3     class Program 4     { 5         static void Main(string[] args) 6         { 7             Light light = new Light(new Off()); 8             light.PressSwich(); 9             light.PressSwich();10             Console.Read();11         }12     }13 14     public class Light15     {16         private LightState state;17         public Light(LightState state)18         {19             this.state = state;20         }21         public void PressSwich()22         {23             state.PressSwich(this);24         }25         public LightState State26         {27             get { return state; }28             set { state = value; }29         }30     }31     public abstract class LightState32     {33         public abstract void PressSwich(Light light);34     }35     public class On : LightState36     {37         public override void PressSwich(Light light)38         {39             Console.WriteLine("Turn off the light.");40             light.State = new Off();41         }42     }43     public class Off : LightState44     {45         public override void PressSwich(Light light)46         {47             Console.WriteLine("Turn on the light.");48             light.State = new On();49         }50     }

优缺点


      优点

     状态模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

    所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换。

    状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。

  缺点

    导致较多的ConcreteState子类

  

转载于:https://www.cnblogs.com/Ming8006/archive/2013/03/01/2938630.html

你可能感兴趣的文章
JS3 -- 模块(cmd amd)
查看>>
转:机器学习算法笔记:谱聚类方法
查看>>
浮点数转换成二进制
查看>>
关于python中的enumerate函数的应用
查看>>
w7 全网架构-rsync-备份
查看>>
解释某宝的一段混淆视听的代码
查看>>
CDH安装指南——酒仙网技术
查看>>
Android---keycode值以及相应名称
查看>>
C/C++实现正负数四舍五入
查看>>
android获取系统应用大小的方法
查看>>
swift菜鸟入门视频教程-05-控制流
查看>>
解决火狐中用JQUERY .removeAttr()无法去除元素属性的方法
查看>>
100723H Obfuscation
查看>>
matplotlib numpy scipy 的安装
查看>>
redux在react中的使用
查看>>
洛谷 P1203 [USACO1.1]坏掉的项链Broken Necklace
查看>>
Angular进阶教程二
查看>>
prism wp7 applicationbar 不能立即触发textbox 的双向绑定
查看>>
repo sync error: .repo/manifests/: contains uncommitted changes
查看>>
cmd 操作命令
查看>>