【设计模式与Android】状态模式——一个人的两幅面孔

什么是状态模式

创新互联专业为企业提供新乐网站建设、新乐做网站、新乐网站设计、新乐网站制作等企业网站建设、网页设计与制作、新乐企业网站模板建站服务,十年新乐做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

 

所谓状态模式,就是当一个对象的内在转台改变时允许改变其行为,这个对象看起来就像是改变了其类的设计模式。状态模式和策略模式都是为具有多种可能情形设计的模式,两者的结构几乎完全一样,但状态模式的行为是平行且不可替换的,而策略模式的行为则是彼此独立的。换句话说就是:状态模式将各个状态所对应的操作分离开来,即对于不同的状态,由不同的子类实现具体操作;而策略模式是直接依赖参数进行选择策略,不存在切换状态的操作。

 

状态模式的实现方式

 

古典名著《×××缘》第二十五回讲述了唐敖和多九公等人乘船在海外游历两面国的故事,两面国的居民天生两幅面孔(状态),他们对人的态度(行为)就是典型的状态模式。首先定义一个行为接口:

public interfaceIState {

    voidface();

    voidword();

}

 

笑脸状态:

public classGoodFaceimplementsIState {
    @Override
    public voidface() {
        Log.e("表情","和颜悦色、满面谦恭");
    }

    @Override
    public voidword() {
        Log.e("语言","嘤嘤嘤");
    }
}

 

凶脸状态:

public classBadFaceimplementsIState {
    @Override
    public voidface() {
        Log.e("表情","鼠眼鹰鼻,满面横肉");
    }

    @Override
    public voidword() {
        Log.e("语言","你(N)忙(M)吧(B),我(W)吃(C)柠(N)檬(M)");
    }
}

 

两面国的人天生是演员:

public classActor {

    privateIStateiState;

    private voidsetState(IState iState) {
        this.iState= iState;
    }

    public voidmeetPoorPerson(){
        Log.e("为啥变脸","见到穷人了");
        setState(newBadFace());
    }

    public voidmeetRichPerson(){
        Log.e("为啥变脸","见到有钱人了");
        setState(newGoodFace());
    }

    public voidface(){
        iState.face();
    }

    public voidword(){
        iState.word();
    }
}

 

见到唐敖和多九公之后:

Actor actor =newActor();
Log.e("唐敖","穿着绸衫");
actor.meetRichPerson();
actor.face();
actor.word();
Log.e("多九公","穿着布衫");
actor.meetPoorPerson();
actor.face();
actor.word();

 

静态的文字视觉冲击力不够,读者可以自觉百度“两面国 木偶剧”,保证你对状态模式印象深刻。

 

Android源码中的状态模式

 

(1)WifiSetting

就像Android系统自带拍照、裁剪、相册等系统Activity一样,WifiSetting是一个系统Fragment,用来展示控制Wifi连接的UI。Wifi的开启中、已开启、关闭中、已关闭就是一个典型的状态模式。

 

Android开发中如何利用状态模式

 

(1)当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为的时候适合使用状态模式。因此从事loT开发的Android程序员应该经常用到状态模式(loT设备的开机关机、播放暂停、BLE的连接断开等)。

 

(2)当前任遗留代码中包含大量不易维护的多分支语句(if-else或switch-case)语句,并且这些分支都与对象状态有关并且依赖对象状态时。此时可以用状态模式进行重构。

 

需要注意的几个问题

 

(1)状态模式的使用势必会大大增加类和对象的数量,比策略模式还大,是典型的用性能和效率换开发进度的设计模式之一。


本系列其他博客

【设计模式与Android】责任链模式——曹瞒兵败走华容


【设计模式与Android】命令模式——军令如山

【设计模式与Android】观察者模式——千里眼与顺风耳


【设计模式与Android】备忘录模式——在齐太史简


【设计模式与Android】迭代器模式——容器遍历,细节隐藏


网站名称:【设计模式与Android】状态模式——一个人的两幅面孔
本文网址:http://ybzwz.com/article/gcdpeo.html