博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android中的设计模式之状态模式
阅读量:7236 次
发布时间:2019-06-29

本文共 2742 字,大约阅读时间需要 9 分钟。

参考

  • 《设计模式:可复用面向对象软件的基础 》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中的不同登陆状态下的执行行为

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

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

转载地址:http://ltgfm.baihongyu.com/

你可能感兴趣的文章
groovy gradle 构建配置
查看>>
Linux时间子系统(十五) clocksource
查看>>
BaseRecyclerViewAdapterHelper使用
查看>>
请说出三种减少页面加载时间的方法。
查看>>
HDU 2036 改革春风吹满地
查看>>
Deepin-快捷方式设置
查看>>
管理Java垃圾回收的五个建议
查看>>
【MySQL】MySQL的索引
查看>>
数数字
查看>>
配置阿里云Docker镜像加速仓库
查看>>
社交的基本逻辑
查看>>
DBSCAN
查看>>
Maven 使用 二——nexus
查看>>
解决maven的依赖总是无法下载完成
查看>>
【Python3 爬虫】15_Fiddler抓包分析
查看>>
【备忘】EntityFramework 6 升级到 EntityFrameworkCore 注意点
查看>>
xilinx uboot网卡驱动分析
查看>>
Spring Boot系列之配置日志输出等级
查看>>
Java 底层机制(JVM/堆/栈/方法区/GC/类加载)
查看>>
原 在windows上创建文件名以“.”开头的文件
查看>>