什么是状态模式
所谓状态模式,就是当一个对象的内在转台改变时允许改变其行为,这个对象看起来就像是改变了其类的设计模式。状态模式和策略模式都是为具有多种可能情形设计的模式,两者的结构几乎完全一样,但状态模式的行为是平行且不可替换的,而策略模式的行为则是彼此独立的。换句话说就是:状态模式将各个状态所对应的操作分离开来,即对于不同的状态,由不同的子类实现具体操作;而策略模式是直接依赖参数进行选择策略,不存在切换状态的操作。
状态模式的实现方式
古典名著《×××缘》第二十五回讲述了唐敖和多九公等人乘船在海外游历两面国的故事,两面国的居民天生两幅面孔(状态),他们对人的态度(行为)就是典型的状态模式。首先定义一个行为接口:
public interface IState { void face(); void word();} |
笑脸状态:
public class GoodFace implements IState { @Override public void face() { Log.e("表情","和颜悦色、满面谦恭"); } @Override public void word() { Log.e("语言","嘤嘤嘤"); }} |
凶脸状态:
public class BadFace implements IState { @Override public void face() { Log.e("表情","鼠眼鹰鼻,满面横肉"); } @Override public void word() { Log.e("语言","你(N)忙(M)吧(B),我(W)吃(C)柠(N)檬(M)"); }} |
两面国的人天生是演员:
public class Actor { private IState iState; private void setState(IState iState) { this.iState = iState; } public void meetPoorPerson(){ Log.e("为啥变脸","见到穷人了"); setState(new BadFace()); } public void meetRichPerson(){ Log.e("为啥变脸","见到有钱人了"); setState(new GoodFace()); } public void face(){ iState.face(); } public void word(){ iState.word(); }} |
见到唐敖和多九公之后:
Actor actor = new Actor();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】备忘录模式——在齐太史简