13.3.5策略模式
策略模式定义一系列的算法,并把每一个算法封装起来, 且使它们可相互替换,使得算法的变化可独立于使用它的客户。
此模式的使用场景:
(1)针对同一类问题的多种处理方式,仅仅是具体行为有差别时。
(2)需要安全地封装多种同一类型操作时。
(3)出现同一抽象类有多个子类,而又需要使用if-else或switch-case来选择具体子类时。
如各类列表的排序功能,及计算各类商品的费用时(不同商品的单价和总价的计算方式可能不同),可以使用策略模式。
状态模式允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
状态模式将每一个条件分支放入一个独立的类中,这使得可以根据对象自身的情况将对象状态作为一个对象,这一对象可以不依赖于其他对象而独立变化,通过多态来去除过多的、重复的if-else等分支语句。
此模式的使用场景:
(1)一个对象的行为取决于它的状态,且它必须在运行时根据状态改变它的行为。
(2)代码中包含大量与对象状态有关的条件语句,且这些分支依赖于改对象的状态。
(3)出现同一抽象类有多个子类,而又需要使用if-else或switch-case来选择具体子类时。
如电商APP的订单对象有多种状态,及用户登录对象有已登录和未登录两种状态,都可使用状态模式。
命令模式将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
此模式的使用场景:
(1)需要抽象出待执行的动作,然后以参数的形式提供出来。
(2)需要支持取消操作。
(3)支持修改日志功能和事务操作。
如游戏开发和菜单功能开发,都可使用命令模式。
观察者模式定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
此模式的使用场景:
(1)有关联行为的地方。
(2)事件多级触发的地方。
(3)跨系统的消息交换,如消息队列和事件总线的处理机制。
如Android的BroadcastReceiver组件功能、GUI系统和订阅-发布系统,都是使用观察者模式。
参考:《Android源码设计模式解析与实战》