State Pattern
问题:
一个对象在处以不同状态时, 如何在对待同一方法时能有不同的处理方式
原方案:
public class Machine { int stateA = 1; int stateB = 2; int stateC = 3; // ..... int State = stateA; public void Operation1() { if(State == stateA) { // 处理方式1 } else if(State == stateB) { // 处理方式2 } else if(State == stateC) { // 处理方式3 } } public void Operation2() { if(State == stateA) {} else if(State == stateB) {} else if(State == stateC) {} } public void Operation3() { if(State == stateA) {} else if(State == stateB) {} else if(State == stateC) {} } }
问题:
当我们继续新增一个 或者多个状态的时候,
需要不停的 在每个方法中都添加相应的判断
不好维护
所以:
可以将所有 状态 都当成一个对象,
由状态本身来判断该做什么样的 处理方式
我们只要对在该对象上 不停的变更状态实体就能得出相同的结果
public abstract class State { public virtual void Operation1() { } public virtual void Operation2() { } public virtual void Operation3() { } } |
||
public class StateA : State { Machine mechine; public StateA(Machine mechine) { // 获取 对象本身, // 可能需要发生状态改变 this.mechine = mechine; } public override void Operation1() { // 处理方式1 // 改变状态 mechine.SetState(mechine.StateB); } // 默认的方法可以不覆盖 // 使用基类的处理方式 } |
public class StateB : State { Machine mechine; public StateB(Machine mechine) { // 获取 对象本身, // 可能需要发生状态改变 this.mechine = mechine; } public override void Operation1() { // 处理方式2 } // 默认的方法可以不覆盖 // 使用基类的处理方式 } |
public class StateC : State { Machine mechine; public StateC(Machine mechine) { // 获取 对象本身, // 可能需要发生状态改变 this.mechine = mechine; } public override void Operation1() { // 处理方式3 } // 默认的方法可以不覆盖 // 使用基类的处理方式 } |
public class Machine { State stateA = new StateA(this); State stateB = new StateB(this); State stateC = new StateC(this); // ..... |
结论:
利用状态模式, 可以随意在外部增加状态
不必担心对象中需要多少修改
(对象中的 状态也可以利用数组来实现 避免每增加一个状态就需要实例化一个状态实例)