在阎宏博士的《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);//设置初始状态 }
未完待续,有不对的地方,请指正。