Android中的设计模式之命令模式
参考
- 《设计模式:可复用面向对象软件的基础 》5.2 Command 命令 对象行为型模式
- 《Android源码设计模式解析与实战》第11章 让程序畅通执行--命令模式
意图
将一个请求封装为一个对象,从而使你可用不同地请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销地操作。
适用场景
- 需要抽象出待执行地动作,然后以参数地形式提供出来,类似于过程设计中的回调机制,命令模式正是回调机制的一个面向对象的替代品
- 在不同的时刻指定、排列和执行请求。一个命令对象可以有与初始请求无关的生存期。
- 需要支持取消操作。
- 支持修改日志功能,这样当系统崩溃时,这些修改可以被重做一遍。
- 需要支持事物操作。
结构
- Reicever 接收者角色,负责具体执行一个请求,任何一个类都可以成为一个接收者,而在接收者类中封装具体操作逻辑的方法我们称为行动方法(action)
- Command 命令角色 定义所有具体命令类的抽象接口
- ConcreteCommand 具体命令角色,实现了Command接口,在excute方法中调用接收者角色的相关方法,在接收者和命令执行的具体行为之间加以弱耦合。execute方法成为执行方法(excute)
- Invoker 请求者角色,负责调用命令对象执行具体的请求,相关的方法我们成为行动方法(action)
- Client 客户端角色
执行流程
代码就略了
优点
更弱的耦合性,更灵活的控制性以及更好的扩展性
缺点
类膨胀,大量衍生类的创建。
例子1 操纵俄罗斯方块变换
描述
大家小时候都玩过俄罗斯方块,游戏中有4个按钮,分别是两个左右移动的按钮,一个快速落下的按钮,一个变化方块形状的按钮。所以四个按钮就相当于请求者,执行具体按钮命令的逻辑方法块可以看作命令角色。
结构
代码实现
/** * 命令的接收者,负责具体执行请求 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/20 23:35 */ public class TetrisMachine { public void toLeft(){ System.out.println("向左"); } public void toRigth(){ System.out.println("向右"); } public void fastToBottom(){ System.out.println("快速向下"); } public void transform(){ System.out.println("变换形状"); } } /** * 命令抽象 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/20 23:37 */ public interface Command { /** * 执行命令 */ void execute(); } /** * 向左命令 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/20 23:39 */ public class LeftCommand implements Command { private TetrisMachine tetrisMachine; public LeftCommand(TetrisMachine tetrisMachine) { this.tetrisMachine = tetrisMachine; } @Override public void execute() { tetrisMachine.toLeft(); } } /** * 向右命令 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/20 23:39 */ public class RightCommand implements Command { private TetrisMachine tetrisMachine; public RightCommand(TetrisMachine tetrisMachine) { this.tetrisMachine = tetrisMachine; } @Override public void execute() { tetrisMachine.toRigth(); } } /** * 快速向下命令 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/20 23:39 */ public class FallCommand implements Command { private TetrisMachine tetrisMachine; public FallCommand(TetrisMachine tetrisMachine) { this.tetrisMachine = tetrisMachine; } @Override public void execute() { tetrisMachine.fastToBottom(); } } /** * 变换形状命令 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/20 23:39 */ public class TransformCommand implements Command { private TetrisMachine tetrisMachine; public TransformCommand(TetrisMachine tetrisMachine) { this.tetrisMachine = tetrisMachine; } @Override public void execute() { tetrisMachine.transform(); } } public static void main(String[] args){ TetrisMachine tetrisMachine = new TetrisMachine(); LeftCommand leftCommand = new LeftCommand(tetrisMachine); RightCommand rightCommand = new RightCommand(tetrisMachine); FallCommand fallCommand = new FallCommand(tetrisMachine); TransformCommand transformCommand = new TransformCommand(tetrisMachine); leftCommand.execute(); leftCommand.execute(); fallCommand.execute(); transformCommand.execute(); rightCommand.execute(); }
执行结果:
向左 向左 快速向下 变换形状 向右
例子2 Android事件机制中底层逻辑对事件的转发处理
Android的每一种事件在屏幕上产生后都会经由底层逻辑将其转换为一个NotifyArgs对象,NotifyAgs本身并无实现,其实它就相当于一个Command抽象。
例子3 运用命令模式实现Android绘图板
后更

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android 基础动画之属性动画详解
在上两篇文章主要介绍了 Android 基础动画之帧动画 以及 Android 基础动画之补间动画 。本篇文章主要介绍的是Android基础动画之 属性动画 。 在 补间动画 这篇文章的末尾有说道,补间动画执行完毕以后,加载的view实际上是没有点击事件的,因为点击事件依旧附着在原来的view位置,所以这种动画的完整体验有点蜜汁尴尬。为了解决这种设计之初带来的体验问题,Android3.0以后开始引入属性动画来完美解决这一历史遗留问题。 属性动画的强大之处在于,它可以作用到任何对象(不仅仅针对视图View对象),另外,属性动画还可以自定义各种动画效果(不仅仅是平移、旋转、缩放、透明度的变化)。那么属性动画是如何做到这些功能的?它的原理是在一定时间内,不断对值进行改变,并不断将该值赋给对象的属性,从而实现该对象在该属性上的动画效果。 说完了属性动画的作用和优点,下面就用代码去学习掌握属性动画。其中属性动画有两个非常重要的类:分别是ValueAnimator 类、ObjectAnimator 类。 ObjectAnimator: ObjectAnimator简单理解是直接对对象的属性值进行...
- 下一篇
[雪峰磁针石博客]软件测试专家工具包3移动端
UI Automator UI Automator提供了一组API来构建基于交互UI的测试。API允许你执行操作,如打开设置菜单,非常适合黑盒自动化测试,在测试代码不依赖于应用的内部实现 uiautomatorviewer提供了一个方便的图形用户界面进行扫描和分析在Android设备上当前显示的UI组件。您可以使用此工具来检查的布局层次和查看UI组件。 UiDevice类可以访问设备并进行操作。你可以调用它的方法来访问设备属性,如当前的方向或显示尺寸。该UiDevice类也让您执行操作,例如:旋转设备;按下D-pad按钮;按Back、Home、Menu等;打开通知树栏;当前窗口截图等。 应用相关的API: UiCollection枚举容器的UI元素以计数,或通过文字(或属性等)针定位子元素; UIObject表示是在设备上可见的UI元素; UiScrollable?:为可滚动UI容器提供查找支持; UiSelector?:查询一个或者多个UI元素; Configurator: 设置参数。 示例:更改语言 #!/usr/bin/env python # -*- coding: utf-8...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS关闭SELinux安全模块
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Windows10,CentOS7,CentOS8安装Nodejs环境