Android中的设计模式之命令模式

news/2023/12/9 16:10:18

参考

  • 《设计模式:可复用面向对象软件的基础 》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绘图板

后更


http://www.niftyadmin.cn/n/2752282.html

相关文章

SQL Server 用角色(Role)管理数据库权限

当数据库越来越多,连接到数据库的应用程序,服务器,账号越来越多的时候,为了既能达到满足账号操作数据权限需求,又不扩大其操作权限,保证数据库的安全性,有时候需要用角色来参与到权限管理中&…

手把手教你用 JavaScript 实现一个简单的国际象棋 AI

本文作者: Lauri Hartikka 编译:胡子大哈 翻译原文:http://huziketang.com/blog/posts/ 英文连接:A step-by-step guide to building a simple chess AI 转载请注明出处,保留原文链接以及作者信息 首先让我们先看几个…

一分钟小讲堂:弹性裸金属服务器(神龙)

本文总字数约900字,阅读大约需要1分钟。 阿里云ECS有一款明星产品:弹性裸金属服务器(神龙)。由于名字比较长,又常常被媒体曝光,很多朋友不明觉厉。我们今天来简单了解一下它的诞生背景和主要特点。 目前&am…

(23)目标检测算法之YOLOv6 (1)全流程指南:环境安装、模型配置、训练及推理

目标检测算法之YOLOv6 (1)全流程指南:环境安装、模型配置、训练及推理 本文向将介绍 YOLOv6 的整体框架,并提供详细的教程链接。官方论文 ☞ YOLOv6: A Single-Stage Object Detection Framework for Industrial Applicationsv3.0版本论文更新 ☞ YOLOv…

Swift--使图片360° 周期旋转

UIImageViewExtension.swift import UIKitextension UIImageView {// 360度旋转图片 func rotate360Degree() { let rotationAnimation CABasicAnimation(keyPath: "transform.rotation.z") // 让其在z轴旋转 rotationAnimation.toValue NSNumber(double: M_PI * 2…

HTML 关于轮播的几种简单写法

开发工具与关键技术:Adobe Dreamweaver CC 2017 图片的自动播放 定时器 高亮效果 bootstrap-4的使用 作者:孙水兵 撰写时间:2019年1月16第一种:使用js 主要思路:先将需要轮播的几张图通过浮动使其并排显示在在luobo这个盒子中…

nginx upstram 支持的几种模式

本文转载自 我关注的微信公众号 非个人原创1、轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。2、weight指定轮询几率,weight和访问比率成正比,用于后端服务…

Bootstrap 4 简单使用

开发工具与关键技术:Adobe Dreamweaver CC 2017 Bootstrap 4的使用 作者:孙水兵 撰写时间:2019年1月16Bootstrap是当前世界主流的响应式、移动设备优先的门户和应用前端框架。使用它我们可以减少许多代码,并且让布局更加简单&am…

Hibernate之关联关系

时间:2017-1-20 16:28 ——一对多配置1、第一步:创建实体类 * 客户实体 * 订单实体 示例代码: /** * 客户实体* author WYC**/public class Customer {private Integer cid;private String name;// 一个客户有多个订单//…

Windows内核之线程简单介绍

1 线程定义 <1> 内核对象&#xff0c;操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方 <2>还有一个是线程堆栈。它用于维护线程在运行代码时须要的全部函数參数和局部变量. 2 线程和进程的差别 <1>进程是不活泼的。进程从来不运行…

分别使用 jQuer与 JS 写出tab选项卡

开发工具与关键技术&#xff1a;Adobe Dreamweaver CC 2017 jQuery与JS的使用 作者&#xff1a;孙水兵 撰写时间&#xff1a;2019年1月18jQuery是一个JavaScript函数库&#xff0c;是目前主流的 JS 框架。 JQuery官方的主旨是&#xff1a;write less, do more&#xff08;以…

springmvc入门之映射处理器(一)

2019独角兽企业重金招聘Python工程师标准>>> 1.简析映射处理器 在spring mvc中,使用映射处理器可以把web请求映射到正确的处理器上&#xff0c;spring内置了很多映射处理器&#xff0c;而且我们也可以自定义映射处理器。下面的实例展示spring中最常用的两个映射处理…

使用 jQuer与 JS 写遮罩层 、展开与收起

开发工具与关键技术&#xff1a;Adobe Dreamweaver CC 2017 jQuery与JS的使用 作者&#xff1a;孙水兵 撰写时间&#xff1a;2019年1月25上次用jQuery写了一个tab选项卡&#xff0c;关于jQuery我就不再多说。 遮罩层 HTML代码部分 写一个按钮用来控制遮罩层的显示与隐藏&#x…

使用jQuery完成显示与隐藏、添加高亮效果

开发工具与关键技术&#xff1a;Adobe Dreamweaver CC 2017 jQuery 作者&#xff1a;孙水兵 撰写时间&#xff1a;2019年1月30达到的效果&#xff1a; 1&#xff1a;点击显示全部品牌&#xff0c;将隐藏的品牌显示&#xff0c;给小米、华为、一加增加高亮效果&#xff0c;将显示…

键盘事件 和键码

<script type"text/javascript" languageJavaScript charset"UTF-8">document.onkeydownfunction(event){var eevent||window.event||arguments.callee.caller.arguments[0];if(e && e.keyCode27){ // 按 Esc //要做的事情}if(e && …

map正序、逆序排序

一、按 key 排序 1.map顺序排序(小的在前&#xff0c;大的在后)&#xff1a; map<float,string,less<float> > m_aSort;//已float从小到大排序 2.map逆序排序(大的在前&#xff0c;小的在后)&#xff1a; map<float,string,greater<float> > m_aSortR;…
最新文章