Thursday, January 7, 2021

Android Status Pattern

5. 应用场景

  • 对象的行为取决于其状态,随着状态改变时其行为也需改变
  • 包含大量的与状态相关的条件判断语句时

6. 优点

  • 每个状态都是一个子类,易于扩展和维护。
  • 避免过多的条件语句,使得结构更清晰,提高代码的可维护性。

7. 缺点

  • 可能会导致状态子类会过多

举个例子把,比如电视,电视有2个状态,一个是开机,一个是关机,开机时可以切换频道,关机时切换频道不做任何响应。

================================================================

public interface TvState{

    public void nextChannerl();

    public void prevChannerl();

    public void turnUp();

    public void turnDown();

}


public class PowerOffState implements TvState{

    public void nextChannel(){}

    public void prevChannel(){}

    public void turnUp(){}

    public void turnDown(){}

}


public class PowerOnState implements TvState{

    public void nextChannel(){

        System.out.println("下一频道");

    }

    public void prevChannel(){

        System.out.println("上一频道");

    }

    public void turnUp(){

        System.out.println("调高音量");

    }

    public void turnDown(){

        System.out.println("调低音量"); 

    }

}


public interface PowerController{

    public void powerOn();

    public void powerOff();

}


public class TvController implements PowerController{

    TvState mTvState;

    public void setTvState(TvStete tvState){

        mTvState=tvState;

    }

    public void powerOn(){

        setTvState(new PowerOnState());

        System.out.println("开机啦");

    }

    public void powerOff(){

        setTvState(new PowerOffState());

        System.out.println("关机啦");

    }

    public void nextChannel(){

        mTvState.nextChannel();

    }

    public void prevChannel(){

        mTvState.prevChannel();

    }

    public void turnUp(){

        mTvState.turnUp();

    }

    public void turnDown(){

        mTvState.turnDown();

    }

}


public class Client{

    public static void main(String[] args){

        TvController tvController=new TvController();

        tvController.powerOn();

        tvController.nextChannel();

        tvController.turnUp();

        tvController.powerOff();

        tvController.turnUp();

    }

}

================================================================

在Android源码中,哪里有用到状态模式呢?其实很多地方用到了,举一个地方例子,就是WIFI管理模块。

当WIFI开启时,自动扫描周围的接入点,然后以列表的形式展示;当wifi关闭时则清空。这里wifi管理模块就是根据不同的状态执行不同的行为。

No comments:

Post a Comment

n8n index

 【n8n免費本地端部署】Windows版|程式安裝x指令大補帖  【一鍵安裝 n8n】圖文教學,獲得無限額度自動化工具&限時免費升級企業版功能