美文网首页
设计模式之状态模式

设计模式之状态模式

作者: Kevin_小飞象 | 来源:发表于2019-04-04 09:59 被阅读0次

    定义

    状态模式中的行为是由状态来决定,不同的状态下有不同的行为。当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

    Android 中源码使用状态模式

    1. 登录系统,根据用户是否登录,判断事件的处理方式。
    2. Wi-Fi管理,在不同的状态下,WiFi的扫描请求处理不一。

    特点

    • 优点
      将所有与一个特定的状态相关的行为都放入一个状态对象中,它提供了一个更好的方法来组织与特定状态相关的代码,将繁琐的状态判断转换成结构清晰的状态类族,在避免代码膨胀的同时也保证了可扩展性与可维护性。

    • 缺点
      状态模式的使用必然会增加系统类和对象的个数。

    使用场景

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

    简单实现

    需求:首先将电视的状态分为开机与关机状态,开机时可以通过遥控器实现频道切换和调节音量,但是关机时,这些操作都会失效。

    /**
     * Created on 2019/4/4 09:29
     *  电视状态接口
     * @author Scarf Gong
     */
    public interface TVState {
    
        void nextChannel();
    
        void prevChannel();
    
        void turnUp();
    
        void turnDown();
    
    }
    
    ---------------------------
    /**
     * Created on 2019/4/4 09:40
     *  关机状态
     * @author Scarf Gong
     */
    public class PowerOffState implements TVState {
        @Override
        public void nextChannel() {
    
        }
    
        @Override
        public void prevChannel() {
    
        }
    
        @Override
        public void turnUp() {
    
        }
    
        @Override
        public void turnDown() {
    
        }
    }
    
    ---------------------------
    /**
     * Created on 2019/4/4 09:41
     *  开机状态
     * @author Scarf Gong
     */
    public class PowerOnState implements TVState {
        @Override
        public void nextChannel() {
            Log.d("TAG", "下一个频道");
        }
    
        @Override
        public void prevChannel() {
            Log.d("TAG", "上一个频道");
        }
    
        @Override
        public void turnUp() {
            Log.d("TAG", "调高声音");
        }
    
        @Override
        public void turnDown() {
            Log.d("TAG", "调低声音");
        }
    }
    
    /**
     * Created on 2019/4/4 09:45
     * 电源操作接口
     * @author Scarf Gong
     */
    public interface PowerController {
        void powerOn();
    
        void powerOff();
    } 
    
    ---------------------------------
    /**
     * Created on 2019/4/4 09:46
     * 遥控器
     * @author Scarf Gong
     */
    public class TVController implements PowerController {
        private TVState mState;
    
        public void setState(TVState state) {
            mState = state;
        }
    
        @Override
        public void powerOn() {
            setState(new PowerOnState());
            Log.d("TAG", "开机了");
        }
    
        @Override
        public void powerOff() {
            setState(new PowerOffState());
            Log.d("TAG", "关机了");
        }
    
        public void nextChannel() {
            mState.nextChannel();
        }
    
        public void preChannel() {
            mState.prevChannel();
        }
    
        public void turnUp() {
            mState.turnUp();
        }
    
        public void turnDown(){
            mState.turnDown();
        }
    }
    

    使用:

    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            initData();
        }
    
        private void initData() {
            TVController controller = new TVController();
    
            controller.powerOn();  //开机了
    
            controller.nextChannel();  //下一个频道
    
            controller.turnDown();   //调低声音
    
            controller.powerOff();  //关机了
    
            controller.turnUp();    //无效
        }
    }
    

    结果:

    2019-04-04 09:53:44.53 D/TAG: 开机了
    2019-04-04 09:53:44.53 D/TAG: 下一个频道
    2019-04-04 09:53:44.53 D/TAG: 调低声音
    2019-04-04 09:53:44.53 D/TAG: 关机了
    
    

    相关文章

      网友评论

          本文标题:设计模式之状态模式

          本文链接:https://www.haomeiwen.com/subject/gagxiqtx.html