状态模式

96
明朗__
2017.02.28 15:10* 字数 275

定义:
当一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。又称状态对象模式,状态模式是对象的行为模式。

使用场景:

  1. 一个对象的行为取决于他的状态,并且他必须在运行时根据状态改变他的行为
  2. 代码中包含大量与对象相关的条件语句,例如一个操作中含有多分支语句。这些分支历来与该对象
  3. 状态模式将每一个条件分支放入一个独立类中,这使得你可以根据对象自身的情况将状态作为一个对象。这一对象可以不依赖于其他对象而独立变化。这样通过过多的,重复的if-else分支语句

案例(电视剧开关机 和选择上一个和下一个频道)

  1. 抽象状态(State)角色
//定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。
public interface TvState {
     void nextChannel();//下一个频道
     void preChannel();//上一个频道
     void  turnOn();//开机
     void  turnOff();//关机
}
  1. 具体状态(ConcreteState)角色
每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。
//关机状态
public class PowerOffState implements TvState {
    @Override
    public void nextChannel() {
        System.out.print("无效"+"\n");
    }

    @Override
    public void preChannel() {
        System.out.print("无效"+"\n");
    }

    @Override
    public void turnOn() {
        System.out.print("无效"+"\n");
    }

    @Override
    public void turnOff() {
        System.out.print("关机了"+"\n");
    }
}
//开机状态下
public class PowerOnState implements TvState {
    @Override
    public void nextChannel() {
        System.out.print("下一个频道"+"\n");
    }

    @Override
    public void preChannel() {
        System.out.print("上一个频道"+"\n");
    }

    @Override
    public void turnOn() {
        System.out.print("开机了"+"\n");
    }

    @Override
    public void turnOff() {
        System.out.print("关机了"+"\n");
    }
}
  1. 环境(Context)角色
//上下文:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个定义了对象的当前状态
public class TvControl {
    TvState mTvState;
    public  void setState(TvState mTvState){
        this.mTvState=mTvState;
    }
    public void powerOn(){
        setState(new PowerOnState());//开机
        mTvState.turnOn();
    }
    public void powerOff(){
        setState(new PowerOffState());//关机
        mTvState.turnOff();
    }
    public void nextChannel() {
        mTvState.nextChannel();//上一个频道
    }

    public void preChannel() {
        mTvState.preChannel();//下一个频道
    }

    public void turnOn() {
        mTvState.turnOn();//开机
    }

    public void turnOff() {
        mTvState.turnOff();//关机
    }
}
  1. 客户端调用
public class MyClass {
    public static void main(String[] args){
        TvControl tvControl=new TvControl();
        tvControl.powerOn();//开机
        tvControl.nextChannel();//下一个频道
        tvControl.preChannel();//上一个频道
        tvControl.powerOff();//关机
        tvControl.powerOff();//关机
    }
}
开机了
下一个频道
上一个频道
关机了
关机了
设计模式
Web note ad 1