每日Android源码设计模式之-10、命令模式

命令模式没有很多的条条框框,更为灵活多变,比如程序菜单命令,点击“关机”按钮以后,系统会执行一系列操作,暂停处理事件、保存配置、结束进程等等。

定义:

将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。

使用场景:

需要抽象出待执行的动作,然后以参数的形式提供出来,类似于过程设计中的回调机制。

在不同时刻、排列和执行请求。一个命令对象可以有与初始请求无关的生存期。

需要支持取消操作。

支持修改日志功能,这样当系统崩溃时,这些修改可以被重做一遍。

需要支持实务操作。

类图:

《每日Android源码设计模式之-10、命令模式》

很简单,也就是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方法来请求命令。

    原文作者:Alexey
    原文地址: https://www.jianshu.com/p/5ffc077cc8bc
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞