状态模式

Android进阶之设计模式

状态模式

定义: 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类.

使用场景:

  1. 一个对象的行为取决于它的状态,而且他必须在运行时根据状态改变它的行为.
  2. 代码中包含大量与对象状态有关的条件语句.

举个电视剧的例子:

第一版代码:

//电视遥控器,含有 开机,关机,下一个频道,上一个频道,调高音量,调低音量
public class TVController {
    //开机状态
    private final static int POWER_ON = 1;

    //关机状态
    private final static int POWER_OFF = 2;

    private int state = POWER_OFF;

    public void powerOn(){
        if (state == POWER_OFF){
            System.out.println("开机啦");
        }
        state = POWER_ON;
    }

    public void powerOff(){
        if (state ==POWER_ON){
            System.out.println("关机啦");
        }
        state = POWER_OFF;
    }

    public void nextChannel(){
        if (state == POWER_ON){
            System.out.println("下一个频道");
        }else {
            System.out.println("两个红灯提示没有开机");
        }
    }


    public void prevChannel(){
        if (state == POWER_ON){
            System.out.println("上一个频道");
        }else {
            System.out.println("两个红灯提示没有开机");
        }
    }

    public void turnUp(){
        if (state == POWER_ON){
            System.out.println("调高音量");
        }else {
            System.out.println("两个红灯提示没有开机");
        }
    }

    public void turnDown(){
        if (state == POWER_ON){
            System.out.println("调低音量");
        }else {
            System.out.println("两个红灯提示没有开机");
        }
    }
}

这样就有很多重复代码,相对较为混乱. 下面就使用状态模式 简单处理一下.


//定义电视操作的函数
public interface TvState {

    public void nextChannel();

    public void prevChannel();

    public void turnUp();

    public void turnDown();

}

public class PowerOffStatus 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() {
        System.out.println("下一个频道");
    }

    @Override
    public void prevChannel() {
        System.out.println("上一个频道");
    }

    @Override
    public void turnUp() {
        System.out.println("声音跳大");
    }

    @Override
    public void turnDown() {
        System.out.println("声音跳小");
    }
}


public interface PowerController {

    public void powerOn();

    public void powerOff();
}


public class TvControll implements PowerController{
    TvState tvState;

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

    @Override
    public void powerOn() {
        setTvState(new PowerOnState());
        System.out.println("开机啦");
    }

    @Override
    public void powerOff() {
        setTvState(new PowerOffStatus());
        System.out.println("关机啦");
    }

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

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

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

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

}

Client 使用


 public static void main(String[] args) {
 
        TvControll tvControll = new TvControll();

        //设置开机状态
        tvControll.powerOn();
        //下一个频道

        tvControll.nextChannel();

        //调高音量
        tvControll.turnUp();

        //关机状态
        tvControll.powerOff();
        //调低音量
        tvControll.turnDown();

}

打印出来的:

开机啦
下一个频道
声音跳大
关机啦

关机后没有办法调低音量的. 这个虽然代码,类多了,但是逻辑很清晰明了.

推荐阅读更多精彩内容