一 状态模式概念和类图
概念:
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。状态模式将状态封装成了独立的类,并将动作委托代表当前状态的对象,行为会随着内部状态的改变而改变。
状态模式的类图:
二 状态模式在Android的蓝牙模块中的应用:
蓝牙应用层蓝牙耳机通话流程中使用了状态模式:
/**
* Bluetooth Handset StateMachine
* (Disconnected)
* | ^
* CONNECT | | DISCONNECTED
* V |
* (Pending)
* | ^
* CONNECTED | | CONNECT
* V |
* (Connected)
* | ^
* CONNECT_AUDIO | | DISCONNECT_AUDIO
* V |
* (AudioOn)
蓝牙耳机状态机包含上面所述的四种状态,实现四种状态之间的切换,且将状态切换封装在状态类中,很好的体现了状态模式的使用方式。
类图:
Android是怎么封装的状态机,参考google源代码解读就ok了!
三 状态模式的优点和缺点:
优点:
结构清晰,避免了使用过多的条件判断语句,便于维护。
满足开闭原则,如果有新增状态,只需要增加一个state的子类即可。
将状态的变化放到了类的内部来进行,外部的使用者不需要care内部是如何实现状态切换的。
缺点:
每种状态都是一个单独的类,类群比较大。Android中的状态机将所有的状态都作为内部类来使用,提高了代码之间的内聚性。
四 状态模式和策略模式的区别
状态模式和策略模式的类图很相近,但实际上两者是有本质却别的:
1 策略模式的客户端需要知道所有的策略,然后决策Context所要组合的策略对象时哪一个,但是状态模式,客户端对于状态对象了解不多。
2 策略模式是对继承的一种好的替代方式,状态模式主要是减少条件判断,增加程序的可读性。