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);//设置初始状态

    }


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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。