状态模式(State Pattern)
状态模式能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。
结构图:
角色:
- 上下文(Context): 保存了对于一个具体状态对象的引用,并会将所有与该状态相关的工作委派给它。上下文通过状态接口与状态对象交互,且会提供一个设置器用于传递新的状态对象。
- 状态(State):抽象状态类或者接口,定义一个或一组行为,表示该状态下的行为。
- 具体状态(Concrete States):具体状态,实现了State中定义的行为,达到不同状态下的不同行为。
适用场景:
- 当一个对象的行为取决于它的状态,并且它必须在运行时根据状态来改变他的行为时。
优点:
- 每个状态的行为都被放在单独的类中,符合单一原则。
- 无需修改已有状态类和上下文就能引入新状态。符合开闭原则。
缺点:
- 代码复杂度增加。
代码(C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| public class Switcher { private IState _state;
public Switcher() { _state = new Off(); }
public void SwitchOn() { _state.SwitchOn(this); }
public void SwitchOff() { _state.SwitchOff(this); }
public void Set(IState state) { _state = state; }
public IState Get() { return _state; } }
public interface IState { public void SwitchOn(Switcher switcher);
public void SwitchOff(Switcher switcher); }
public class On : IState { public void SwitchOn(Switcher switcher) { Console.WriteLine("亮灯"); switcher.Set(new Off()); }
public void SwitchOff(Switcher switcher) { Console.WriteLine("已经亮灯"); } }
public class Off : IState { public void SwitchOn(Switcher switcher) { Console.WriteLine("已经熄灯"); }
public void SwitchOff(Switcher switcher) { Console.WriteLine("熄灯"); switcher.Set(new On()); } }
|
最后
状态模式是状态机的一种实现方式。