学习笔记

Android源码设计模式_5状态模式
Publish: 2018/8/16   

定义

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

使用场景

  1. 一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为。
  2. 代码中包含大量与对象状态有关的条件语句,例如一个操作中含有庞大的多分支语句(if-else或switch-case),且这些分支依赖于该对象的状态。

实现示例

 //电视状态接口,定义了电视操作的函数
 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(){
          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{
     void powerOn();

     void powerOffer();
 }

 //电视遥控器,类似于经典状态中的Context
 public class TvController implements PowerController{
     TvState mTvState;

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

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

     @Override
     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 mian(String[] args){
         TvController tvController = new TvController();
         //设置开机状态
         tvController.powerOn();
         //下一频道
         tvController.nextChannel();
         //调高音量
         tvController.turnUp();
         //设置关机状态
         tvController.powerOff();
         //调高音量,此时不会生效
         tvController.turnUp();
     }
 }

状态模式和策略模式的区别



← Android源码设计模式_6责任链模式 Android源码设计模式_4策略模式 →

Powered by Hexo, Theme designs by @hpcslag.
Style-Framework Tocas-UI designs by @yamioldmel