命令模式没有很多的条条框框,更为灵活多变,比如程序菜单命令,点击“关机”按钮以后,系统会执行一系列操作,暂停处理事件、保存配置、结束进程等等。
定义:
将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
使用场景:
需要抽象出待执行的动作,然后以参数的形式提供出来,类似于过程设计中的回调机制。
在不同时刻、排列和执行请求。一个命令对象可以有与初始请求无关的生存期。
需要支持取消操作。
支持修改日志功能,这样当系统崩溃时,这些修改可以被重做一遍。
需要支持实务操作。
类图:
很简单,也就是Invoker请求者类,持有Command类的引用,Command类又持有Receiver类的引用。
当Client调用使用Invoker类去调用方法的时候,先调用Command类的execute方法然后再去调用Receiver类的actioin方法。
也就是由以往的直接调用变为中间多了一层Command类,使得调用与被调用者之间解耦开来。
Android中对命令模式的使用都不是典型,有一些变种
比如:Android的事件机制中低层逻辑对事件的转发处理,每种事件在屏幕上产生后都会由低层逻辑将其转化为一个NotifyArgs对象,它本身没有任何实现,只是定义了抽象的方法体:
struct NotifyArgs(){
virtual ~NotifyArgs(){}
virtual void notify(const sp<InputListenerInterface>&listener) const = 0;
}
按键事件最终被转化为NotifyKeyArgs对象,他继承了NotifyKeyArgs。相当于一个命令者。
而InputDispatcher承担了命令请求者的角色。里面执行notifyKey方法来请求命令。