设计模式之状态模式

一 状态模式概念和类图

概念:

状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。状态模式将状态封装成了独立的类,并将动作委托代表当前状态的对象,行为会随着内部状态的改变而改变。

状态模式的类图:


二 状态模式在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 策略模式是对继承的一种好的替代方式,状态模式主要是减少条件判断,增加程序的可读性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值