Android与设计模式——状态(State)模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述状态(State)模式的:

  状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式。

  状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。

状态模式的结构

  用一句话来表述,状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式的示意性类图如下所示:

  状态模式所涉及到的角色有:

  ●  环境(Context)角色,也成上下文:此例中由DataConnecton充当,定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。

  ●  抽象状态(State)角色:定义一个接口IState,用以封装环境(Context)对象的一个特定的状态所对应的行为。

  ●  具体状态(ConcreteState)角色:此例中由DcXXXState充当,每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。

  ●  客户端角色:此例中由DcController充当,管理和维护Context。(文字来源于网络)

此实例是Android4.4数据连接部分,DataConnecton继承自StateMachine状态机类,StateMachine状态机类实现了State设计模式的应用,在WiFi、蓝牙、数据连接这三种网络连接的管理实现都使用了State设计模式。

图中看出,共定义了7种状态子类,都是DataConnecton的内部类,数据连接在六种状态中转换,DefaultState是作为其他六个子类的父状态类的,所谓父状态类,就是当子状态类无法处理(在processMessage方法中处理)时,就会交给父状态类来处理。状态的转换是通过DataConnecton的transitionTo()方法来设置的。

源代码(代码太多,只贴Context管理State的代码):

    private DataConnection(PhoneBase phone, String name, int id,
                DcTrackerBase dct, DcTesterFailBringUpAll failBringUpAll,
                DcController dcc) {

        //[mr2] removed
        //setDbg(false);
        addState(mDefaultState);
            addState(mInactiveState, mDefaultState);//mDefaultState作为父状态
            addState(mActivatingState, mDefaultState);
            addState(mRetryingState, mDefaultState);
            addState(mActiveState, mDefaultState);
            addState(mDisconnectingState, mDefaultState);
            addState(mDisconnectingErrorCreatingConnection, mDefaultState);
        setInitialState(mInactiveState);//设置初始状态

    }

未完待续,有不对的地方,请指正。

时间: 2024-08-06 03:24:21

Android与设计模式——状态(State)模式的相关文章

设计模式之State模式

State模式定义: 允许一个对象在状态改变是,改变它的行为.看起来对象似乎修改了它的类. 模式理解(个人): State模式主要解决的事在开发中时常遇到的根据不同状态需要进行不同的处理操作的问题,而这样的问题,大部分人会采用switch-case语句进行处理,这样会造成一个问题:分支过多,而且如果加入一个新的状态就需要对原来的代码进行编译.State模式采用了对这些不同的状态进行封装的方式处理这类问题,当状态改变的时候,进行处理然后在切换到另一种状态.也就是说,把状态的切换责任交给了具体的状态

Java 实现状态(State)模式

/** * @author stone */ public class WindowState { private String stateValue; public WindowState(String stateValue) { this.stateValue = stateValue; } public String getStateValue() { return stateValue; } public void setStateValue(String stateValue) { t

状态(state)模式

*状态模式(State):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的时候,吧状态判断逻辑独立到一系列的类中, 是复杂的逻辑简单化. Work work = new Work(); work.Hour = 10; work.WriteProgram(); work.Hour = 13; work.WriteProgram(); work.Hour = 16; work.WriteProgram(); w

[设计模式]State模式

<Java与模式> 又称状态对象模式.状态模式是对象的行为模式.GOF95 一个对象的行为取决于一个或者多个动态变化的属性,这样的属性叫做状态.这样的对象叫做有状态的对象(stateful). 状态模式把一个所研究的对象的行为包装在不同的状态对象中,每一个状态对象都属于一个抽象状态的一个子类. 状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变. 模式所涉及的对象包括: 1. 抽象状态角色,state,定义一个接口,用以封装环境,context对象的一个特定的状态所对应的行为.

设计模式学习笔记--状态(State)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

C++设计模式之State模式

这里有两个例子: 1.https://www.cnblogs.com/wanggary/archive/2011/04/21/2024117.html 2.https://www.cnblogs.com/jiese/p/3182342.html 关于此设计模式,有几点概括: Context类包含抽象的State *_state成员变量,Context类声明为State类的frend(State至少会调用Context类的ChangeState函数). State是在维护一个状态,这里涉及到一个关

Android与设计模式——代理(Proxy)模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述代理(Proxy)模式的: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式的结构. 所谓代理,就是一个人或者机构代表另一个人或者机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式类图如下: 在代理模式中的角色: ●抽象对象角色(Phone):声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象

Android与设计模式——观察者(Observer)模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述观察者(Observer)模式的: 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)模式. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观察者模式的结构 一个软件系统里面包含了

设计模式之State模式(笔记)

状态模式:当一个对象的内在状态发生改变时允许改变其内在行为,这个对象看起来像是改变了其类. 状态模式主要是解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化. 首先定义一个IState接口 public interface IState { public void handle(Context context); } 接着定义具体的状态类,继承IState接口 public class ConcreteState