<代码>抽象类的状态 { 公共抽象无效执行上下文(上下文); } 类StateA:状态 { 公共覆盖空白执行(上下文语境) { 如果(上下文。过滤器==" + ") { Console.WriteLine(“此时执行加法运行”); } 其他的 { 上下文。状态=new StateB (); } } } 类StateB:状态 { 公共覆盖空白执行(上下文语境) { 如果(上下文。过滤器==?”) { Console.WriteLine(“此时执行减法运行”); } 其他的 { 上下文。状态=new StateC (); } } } 类StateC:状态 { 公共覆盖空白执行(上下文语境) { 如果(上下文。过滤器==?”) { Console.WriteLine(“此时执行乘法运行”); } 其他的 { 上下文。状态=new表示(); } } } 类声明:状态 { 公共覆盖空白执行(上下文语境) { 如果(上下文。过滤器=="/") { Console.WriteLine(“此时执行除法运行”); } 其他的 { 上下文。状态=new StateF (); } } } 类StateF:状态 { 公共覆盖空白执行(上下文语境) { 如果(上下文。过滤器==" + + ") { Console.WriteLine(“此时执行连加运行”); } 其他的 { 上下文。状态=new StateG (); } } } 类StateG:状态 { 公共覆盖空白执行(上下文语境) { Console.WriteLine(“传入的不是“+ - */?该抛异常");//抛异常了,该终止了 } } 类上下文 { 公共字符串过滤=" + "; 个人状态的状态; 公共环境() { 状态=new StateA (); } 公立的状态 { 得到 { 返回状态; } 集 { 这一点。状态=价值; 处理(); } } 公共空间处理() { state.Execute(这个); 状态=new StateA();//状态回归默认, } }//前端 静态void Main (string [] args) { 上下文c=新上下文(); c。过滤器=癮”; c.Handle();//如果状态不回复默认,那么上下文的状态永远为stateG、下面执行就会得不到想要的 c。过滤器=" * "//c.Handle (); Console.ReadLine (); }代码>
总结:状态模式其实就是把对象的各种状态抽离出去成为一组相互独立可互相替换的对象,各个状态中满足条件则执行当前行为,不满足则转入下一个状态。
类似于策略模式,不过策略模式是客户指定当前执行某一策略,状态模式是默认执行某一状态,然后在状态中判断不符合要求就自动转下一个状态。
优点:避免了其他如果判断,维护起来方便,扩展起来方便,符合单一原则。
缺点:环境类和状态类互相依赖;各个条件分散成不同的类,看起来不直观,并且如果有新的状态加入,需要修改最后的状态类(改动很小)。不过比起庞大的条件语句块,这些缺点都可以忽略。