23种设计模式-状态模式(遥控器)

定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
使用场景:
1、一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为。
2、代码中包含大量与对象状态有关的条件语句,例如,一个操作中包含庞大的多分支语句,且这些分支依赖于该对象的状态。
写一个遥控器示例

/**
 * 电视状态接口,定义了电视操作的函数
 */
public interface TvState {
    public void nextChannel();
    public void prevChannel();
    public void turnUp();
    public void turnDown();
}

/**
 * 关机状态,此时只有开机更能是有效的
 */
public class PowerOffState implements TvState {
    @Override
    public void nextChannel() {

    }

    @Override
    public void prevChannel() {

    }

    @Override
    public void turnUp() {

    }

    @Override
    public void turnDown() {

    }
}

/**
 * 开机状态,此时再触发开机功能不做任何操作
 */
public class PowerOnState implements TvState {
    @Override
    public void nextChannel() {
        Log.e("下一频道");
    }

    @Override
    public void prevChannel() {
        Log.e("上一频道");
    }

    @Override
    public void turnUp() {
        Log.e("调高音量");
    }

    @Override
    public void turnDown() {
        Log.e("调低音量");
    }
}

/**
 * 电源操作接口
 */
public interface PowerController {
    public void powerOn();

    public void powerOff();
}

public class TvController implements PowerController, TvState {
    TvState tvState;

    public void setTvState(TvState tvState) {
        this.tvState = tvState;
    }

    @Override
    public void powerOn() {
        setTvState(new PowerOnState());
        Log.e("开机啦");
    }

    @Override
    public void powerOff() {
        setTvState(new PowerOffState());
        Log.e("关机啦");
    }

    @Override
    public void nextChannel() {
        tvState.nextChannel();
    }

    @Override
    public void prevChannel() {
        tvState.prevChannel();
    }

    @Override
    public void turnUp() {
        tvState.turnUp();
    }

    @Override
    public void turnDown() {
        tvState.turnDown();
    }
}

public class Client {
    public static void main(String[] args){
        TvController tvController=new TvController();
        //设置开机
        tvController.powerOn();
        //下一频道
        tvController.nextChannel();
        //调高音量
        tvController.turnUp();
        //设置关机
        tvController.powerOff();
        //调高音量,此时不会生效
        tvController.turnUp();
    }
}

你可能感兴趣的:(23种设计模式-状态模式(遥控器))