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

设计模式之状态模式

作者: 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: 关机了

相关文章

  • Java设计模式——状态模式

    Java设计模式之状态模式 这期分享一个行为模式中的状态模式,状态模式是行为模式中的最后几个模式了。希望多多关注交...

  • 设计模式之状态设计模式

    一、浩言 人静而后安,安而能后定,定而能后慧,慧而能后悟,悟而能后得。 二、背景 开年,看了看最近网上传的《阿里巴...

  • 设计模式-状态模式

    设计模式-状态模式 设计模式 状态模式的关键是区分事物内部的状态

  • 设计模式之状态模式

    状态模式 State Intro 状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来...

  • 设计模式之状态模式

    1. 定义 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。它是一种对象行为型模式。 2....

  • 设计模式之状态模式

    状态模式的定义 状态模式的定义如下:Allow an object to alter its behavior w...

  • 设计模式之状态模式

    在开发过程中,我们经常会遇到很多if-else的判断,有的会有很多层,当然也不是说所有的涉及到if-else判断的...

  • 设计模式之状态模式

    UML图: 没怎么完全理解,略过。

  • 设计模式之状态模式

    状态模式 汽车人接口 变形金刚的汽车型状态 变形金刚的战斗型状态 用来管理切换状态的类 客户端 状态模式的场景一个...

  • 设计模式之状态模式

    写在前面 最近写屏幕式智能家电的时候,总是需要处理各种电器状态,比如电源开启的情况下才可以进行开风机操作,风力档位...

网友评论

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

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