【状态模式】—— 描述行为变化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Pro_Vinny/article/details/81953299

状态模式,当一个对象的内部状态改变时它的行为也允许改变,这个对象看起来像是改变了它的类。

一、关键点

1)先看下这个模式点关键点:

行为描述:该模式把对象的行为定义在不同的状态对象里,并通过状态的变化来改变行为;

指针:状态模式的一个比较明显的特点就是状态间的关系类似于指针的关系,即根据条件的不同,当前指向的行为对象也不一样,这个模式也常常用于设计状态机模型。

2)我们再来看下它的类图关系:

Context:该模式的上下文,维护一个定义当前状态的State实例;

State:状态的抽象接口,定义类了状态的公共方法或者对象;

ConcreteState:状态的具体实现类;

二、实现

2.1 State 抽象状态对象

public abstract class State {

    public abstract void handle(StateContext context);
}

2.2 ConcreteState 具体状态实现对象 

public class ConcreteStateA extends State {

    @Override
    public void handle(StateContext context) {
        /* do somethings of state 'A' */
        context.setState(new ConcreteStateB());
    }
}

public class ConcreteStateB extends State {

    @Override
    public void handle(StateContext context) {
        /* do somethings of state 'B' */
        context.setState(new ConcreteStateA());
    }
}

2.3 StateContext 状态的上下文 

public class StateContext {
    private State mState;

    public StateContext(State state) {
        mState = state;
    }

    public void setState(State state) {
        this.mState = state;
    }

    public void handle() {
        mState.handle(this);
    }
}

2.4 Client 客户端对象 

public class Client {

    public static void main(String[] args) {
        StateContext context = new StateContext(new ConcreteStateA());
        context.handle();
        context.handle();
        context.handle();
    }
}

三、小结

3.1 场景 该模式常常用于简化条件语句,消除复杂的条件语句以此来将复杂的行为简单化,结构和流程更加地清晰;

3.2 解耦 该模式把各种状态的转移分布到了状态之间,以此来减少相互直接的依赖;

3.2 灵活变化 该模式的state间的关系类似与指针的关系,能适应不用状态的灵活变化,也满足了业务不断变化的要求;

猜你喜欢

转载自blog.csdn.net/Pro_Vinny/article/details/81953299
今日推荐