定义:状态模式(State Pattern),允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
类型:对象行为型模式
概述:
一个对象有一个状态,那么每一个状态又对应一些相应的行为。如果这个对象有很多状态,那么就要对应非常多的行为。那么对这些状态的判断以及根据状态完成相应的行为,会非常复杂。并且如果想添加一种新的状态时,需要修改很多的现有代码。这也是有违开闭原则的。状态模式正是在这样一种情况下提出来的。
状态模式将每种状态对应的行为抽象出来成为单独的新的对象,这样将状态转换显式化了。状态的变换不再依赖于Context内部的行为了。另外,将状态及行为提出来能够大为降低Context对象的复杂度。另外如果一个State对应多个Context时,State还可以被多个Context对象共享。
状态,我们立马会提出,今天状态不好,做什么都没劲;又或者是今天状态很好,做事得劲,饭也吃得多。那么我们就以一个人不同时刻的状态为例来讲解状态模式。
类图:
参与者:
示例代码:
using System; using System.Collections.Generic; using System.Text; namespace Pattern21 { //抽象状态 public abstract class State { public abstract void Eat(); public abstract void Walk(); } // 高兴时的状态 public class Happy : State { public override void Eat() { human.Eat(); Console.WriteLine("很多!"); } public override void Walk() { human.Walk(); Console.WriteLine("手舞足蹈的!"); } public void Attach(Human _human) { human = _human; } private Human human; } // 伤心时的状态 public class Sad : State { public override void Eat() { human.Eat(); Console.WriteLine("很少!"); } public override void Walk() { human.Walk(); Console.WriteLine("无精打采的!"); } public void Attach(Human _human) { human = _human; } private Human human; } // 一个人 public class Human { private State current; public void SetState(State s) { current = s; } public void Eat() { Console.Write("吃了"); } public void Walk() { Console.Write("走起路来"); } public void Show() { current.Eat(); current.Walk(); } } class Program { static void Main(string[] args) { // 定义一个有很多状态的对象 Human human = new Human(); // 定义一个高兴的状态 Happy hState = new Happy(); hState.Attach(human); human.SetState(hState); human.Show(); // 定义一个伤心的状态 Sad sad = new Sad(); sad.Attach(human); human.SetState(sad); human.Show(); // 还可以添加生病的状态,只需要添加新的类而不需要修改Human类 // ...... Console.Read(); } } }
适用性:
优缺点:
参考资料:
设计模式21——行为型模式之状态模式,布布扣,bubuko.com
原文:http://blog.csdn.net/feihe0755/article/details/21131735