文档章节

Android中的设计模式之状态模式

newtrek
 newtrek
发布于 2018/08/15 23:41
字数 1058
阅读 2
收藏 0

参考

  • 《设计模式:可复用面向对象软件的基础 》5.8 State 状态 对象行为型模式
  • 《Android源码设计模式解析与实战》第7章 随遇而安--状态模式

意图

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

别名

状态对象(Objects for States)

适用场景

  • 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
  • 一个操作中含有庞大的多分支的条件语句,且这些操作分支包含这一相同的状态。这个状态通常用一个或多个枚举常量表示。

状态模式将每一个条件分支放入到一个独立的类中,这使得你可以根据对象自身的情况将对象状态作为一个对象,这一对象可以不依赖于其它对象而独立变化,这样可以通过多态来去除多的,重复的if-else等分支语句。

结构

结构

  • Context 环境类,定义客户需要的接口,维护一个State子类的实例,这个实例定义了当前环境的状态。
  • State 抽象状态类或者状态接口,定义一个或者一组接口,便是该状态下的行为。
  • ConcreteStateA,ConcreteStateB 具体状态类,每一个具体的状态类实现抽象State中定义的接口,从而达到不同状态下的不同行为。

优点

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

缺点

增加了系统类和对象的个数。

应用例子1 电视遥控器

描述

电视的状态分为开机和关机状态,开机可以进行频道切换,调整音量等操作,但是这时重复开机键是无效的;关机状态下,频道切换,调整音量,关机都是无效的操作,只有按开机键会生效。

结构

结构

代码实现

/**
 *  电视不同状态下的相同抽象行为接口
 * @author newtrekWang
 * @email  wangjiaxing20160101@gmail.com
 * @time   2018/8/15  23:30
 */
public interface TvState {
    /**
     * 音量调高
     */
    void turnOn();

    /**
     * 音量调低
     */
    void turnOff();

    /**
     * 下一个频道
     */
    void nextChannel();

    /**
     * 上一个频道
     */
    void preChannel();
}

/**
 *  关机状态下的行为实现
 * @author newtrekWang
 * @email  wangjiaxing20160101@gmail.com
 * @time   2018/8/15  23:22
 */
public class PowerOffState implements TvState {
    @Override
    public void turnOn() {
       // 没有实现即失灵
    }

    @Override
    public void turnOff() {
        // 没有实现即失灵
    }

    @Override
    public void nextChannel() {
        // 没有实现即失灵
    }

    @Override
    public void preChannel() {
        // 没有实现即失灵
    }
}

/**
 *  开机状态下的行为实现
 * @author newtrekWang
 * @email  wangjiaxing20160101@gmail.com
 * @time   2018/8/15  23:22
 */
public class PowerOnState implements TvState {
    @Override
    public void turnOn() {
        System.out.println("音量调高");
    }

    @Override
    public void turnOff() {
        System.out.println("音量调低");
    }

    @Override
    public void nextChannel() {
        System.out.println("切换到了下一个频道");
    }

    @Override
    public void preChannel() {
        System.out.println("切换到了上一个频道");
    }
}

/**
 *  电视机遥控器类
 * @author newtrekWang
 * @email  wangjiaxing20160101@gmail.com
 * @time   2018/8/15  23:29
 */
public class TvController {
    private TvState state;

    public void powerOn(){
        this.state = new PowerOnState();
        System.out.println("已开机");
    }

    public void powerOff(){
        this.state = new PowerOffState();
        System.out.println("已关机");
    }

    public void turnOn() {
        state.turnOn();
    }

    public void turnOff() {
        state.turnOff();
    }


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

    public void preChannel() {
        state.preChannel();
    }

}

应用例子2 Android源码中的WifiDriverState

后更

应用例子3 App中的不同登陆状态下的执行行为

比如应用在已登录状态,点击评论,会正常弹出评论框,而未登录状态下,则是要跳转到登录界面登录后,再正常评论。

所以已登录和未登录状态下的评论行为是不同的,这个就可以用状态模式设计。

© 著作权归作者所有

共有 人打赏支持
newtrek
粉丝 3
博文 21
码字总数 35117
作品 0
江北
程序员
私信 提问
android 设计模式的应用

1 职责链模式 职责链模式的意图为:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。使...

小克898
2014/08/24
0
0
Android 网络编程 目录

Android 网络编程 目录 Android 网络编程1 Http协议 Android 网络编程2 Okhttp缓存机制 Android 网络编程3 Java NIO to be continued... Android 架构师之路 目录 Android 架构师之路1 UML图...

香沙小熊
2018/06/21
0
0
Java 设计模式(14) —— 复合模式

一、复合模式 模式常一起使用,组合在一个设计解决方案中 复合模式在一个解决方案中结合两个或多个模式,能解决一般性或一系列的问题 二、示例 本次设计模式讲解中无代码示例,由于复合模式是...

磊_lei
2018/05/26
0
0
[Andriod设计模式之旅]——Builder模式

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/78764592 前言 具体介绍Builder设计模式之前,首先我们...

紫雾凌寒
2017/12/10
0
0
Android--面试中遇到的问题总结(三)

《Android 开发工程师面试指南 LearningNotes 》,作者是陶程,由梁观全贡献部分。大家可以去知乎关注这两位用心的少年。这份指南包含了大部分Android开发的基础、进阶知识,不仅可以帮助准备...

sealin
2017/02/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

dos echo指令显示“echo处于打开状态”

dos echo指令显示“echo处于打开状态” 我用一下代码想输出 aa 变量。 一个bat文件,文件内容是: set aa = "123"echo %aa%pause 找到答案了。 set aa="123"echo %aa%pause 在aa=...

shzwork
3分钟前
1
0
【行为型】- 责任链模式

责任链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止(如果权限不够则直接跳转)...

ZeroneLove
5分钟前
0
0
Harbor快速部署到Kubernetes集群及登录问题解决

Harbor(https://goharbor.io)是一个功能强大的容器镜像管理和服务系统,用于提供专有容器镜像服务。随着云原生架构的广泛使用,原来由VMWare开发的Harbor也加入了云原生基金会(参考《Har...

openthings
52分钟前
2
0
MQ学习-基本概念区分

消息队列 Kafka 涉及的专有名词和术语进行定义和解释,方便您更好地理解相关概念并使用该产品。 Broker: 消息队列 Kafka 集群包含一个或多个消息处理服务器,该服务器被称为 Broker。 Topi...

os1cheng
今天
3
0
腾讯怒怼:靠红包骗用户下载怎么可以叫产品

近日,社交圈出现了大动荡,三款新推出的社交软件全部被微信封杀,对此,腾讯公关总监在回应外界对于1月15日三款社交新产品撼动微信的消息,他呼吁媒体在批评的同时应当尊重事实,“我们尊重...

linux-tao
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部