状态模式

402 阅读1分钟

概念

与策略模式结构一样,但目的和本质不同。状态模式的行为是平行的,不可替换的;策略模式的行为是相互独立可替换的。状态模式是把对象的行为包装在不同的状态对象中,让对象在其内部状态改变时行为也随之改变。优点同样是可扩展性和让代码清晰;缺点也是增加类和对象数量。

使用场景

  • 一个对象的行为取决于它的状态
  • 代码中含有大量与对象状态有关的条件语句(通过多态去除过多的if-else)

实现方式

interface State{
    void fun();
}

public class State1 implements State{ //开机后的状态 可以操作
    public void fun(){
        // do something;
        System.out.println("hello");
    }
}

public class State2 implements State{//关机后的状态 无操作
    public void fun(){
        // do nothing;
        return;
    }
}

public interface TVController{
    void poweron();
    void poweroff();
}

public class TVContext implements TVController{
    State mState;

    public TVContext(){
        mState = new State2(); //初始化为关机状态
    }

    private void setState(State s){
        mState = s;
    }

    @Override
    public void poweron(){ //开机
        setState(new State1());
    }

    @Override
    public void poweroff{ //关机
        setState(new State2());
    }

    public void watch(){ //看电视(开机状态才看得到,关机状态则什么都没有)
        mState.fun();
    }
}

public class Test {
    public static void main(String[] args){
        TVContext tv = new TVContext();
        tv.poweron();
        tv.watch();
        tv.poweroff();
        tv.watch();
    }
}