大话设计模式之状态模式

状态模式

  允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。状态模式是一种对象行为型模式。

涉及到的角色描述

  (1)Context类,定义客户端所感兴趣的接口,并且内部维护一个具体状态类的实例,从而维护了对象的现有状态。

  (2)State:抽象状态类或状态接口,用以抽象封装行为。

  (3)ConcreteState类:具体状态类,实现了State中的抽象方法。

使用场景描述

  (1)对象的行为依赖于它的状态,并且可以在运行时根据状态改变行为。

  (2)代码中包含大量与对象状态有关的if/else语句,这些条件对应于对象的各种状态,这些冗余条件语句的出现导致代码的可维护性和灵活性变差,这种情况适合使用状态模式进行优化

优点

  在不同状态需要有不同响应的使用场景下,避免了使用if/else导致代码臃肿,使代码结构清晰的同时保证了拓展性和维护性。

缺点

  状态模式的使用必然会增加类和对象的个数,如果使用不当将导致程序结构和代码的混乱。

具体代码示例

  state接口

package com.chenpt.designModel.stateModel;

/**
 * @Author: chen
 * @Description:
 * @Date: created in 2018/8/31
 * @Modified By:
 */
public interface State {
    void doAction(Context context);
}

  具体对象content

扫描二维码关注公众号,回复: 3035721 查看本文章
package com.chenpt.designModel.stateModel;

/**
 * @Author: chen
 * @Description:
 * @Date: created in 2018/8/31
 * @Modified By:
 */
public class Context {
    private State state;

    Context(){
        this.state=null;
    }

    public State getState() {
        return state;
    }

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

  状态A

package com.chenpt.designModel.stateModel;

/**
 * @Author: chen
 * @Description:
 * @Date: created in 2018/8/31
 * @Modified By:
 */
public class StateA implements State {
    @Override
    public void doAction(Context context) {
        context.setState(this);
    }

    public String toString(){
        return "this is stateA";
    }
}

  状态B

package com.chenpt.designModel.stateModel;

/**
 * @Author: chen
 * @Description:
 * @Date: created in 2018/8/31
 * @Modified By:
 */
public class StateB implements State {
    @Override
    public void doAction(Context context) {
        context.setState(this);
    }

    public String toString(){
        return "this is stateB";
    }
}

  客户端

package com.chenpt.designModel.stateModel;

/**
 * @Author: chen
 * @Description:
 * @Date: created in 2018/8/31
 * @Modified By:
 */
public class MainTest {

    public static void main(String[] args){
        Context context = new Context();
        StateA stateA = new StateA();
        StateB stateB = new StateB();

        context.setState(stateA);
        System.out.println(context.getState());

        context.setState(stateB);
        System.out.println(context.getState());
    }

}
//执行结果
this is stateA
this is stateB

  

猜你喜欢

转载自www.cnblogs.com/chenpt/p/9580313.html