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);
    // .....

State _State = stateA; public void Operation1() { _State.Operation1(); } public void Operation2() { _State.Operation2(); } public void Operation3() { _State.Operation3(); } public void SetState(State state) { _State = state; } }

结论:

利用状态模式, 可以随意在外部增加状态

不必担心对象中需要多少修改

(对象中的 状态也可以利用数组来实现 避免每增加一个状态就需要实例化一个状态实例)

posted @ 2015-11-30 20:36  `Laimic  阅读(153)  评论(0)    收藏  举报