敏捷开发笔记(第13章节)--COMMAND模式和ACTIVE OBJECT模式

news2024/9/22 1:29:28

  1:PDF上传链接

【免费】敏捷软件开发(原则模式与实践)资源-CSDN文库

        没有人天生就具有命令他人的权利。
                                                        --Denis Diderot(1713一1784,法国哲学家,百料全书编者) 

        在近几年记述过的所有设计模式中,我认为COMMAND模式是最简单、最优雅的模式之一。
但是我们将会看到,这种简单性是带有欺骗性的。COMMAND模式的适用范围是非常宽广的。
        如图13.1所示,COMMAND模式简单得几乎可笑。程序13.1中的代码并没有起到削弱这种印象的作用。该模式仅由一个具有惟一方法的接口组成,这似乎是荒谬的。 

图13.1COMMAND模式 

程序13.1 Command.java
public interface Command
{
    public void do();
}

        但是,事实上,该模式横过了一条非常有趣的界线。而这个交界处正是所有有趣的复杂性之所在。大多数类都是一组方法和相应的一组变量的结合。COMMAND模式不是这样的。它只是封装了一个没有任何变量的函数。
        从严格的面向对象意义上来讲,这种做法是被强烈反对的一因为它具有功能分解的味道。它把函数层面的任务提升到了类的层面。这简直是对面向对象的亵渎!然而,在这两个思维范式(paradigm)的碰撞处,有趣的事情发生了。

13.1:简单的COMMAND

 图13.2 复印机软件中一些简单的Command

        这些类的职责很明显。如果调用RelayOnCommand的do0方法,它就会开启一些继电器。如果调用MotorOffCommand的do0方法,它就会关闭一些发动机。继电器或者发动机的地址作为构造函数的参数传到对象中去。
        有了这种结构,我们就可以在系统中传递Command对象并调用它们的do0方法,而无需明确地知道它们所代表的Command的种类。这会带来一些有趣的简化。

13.4:ACTIVE OBJECT模式

        ACTIVE OBJECT模式是我最喜欢使用COMMAND模式的地方之一。这是实现多线程控制的一项古老的技术。该模式有多种使用方式,为许多工业系统提供了一个简单的多任务核心。
        想法很简单。考虑程序13.2和程序13.3。ActiveObjectEngine对象维护了一个Command对象的链表。用户可以向该引擎(engine)增加新的命令,或者调用runO。unO函数只是遍历链表,执行并去除每个命令。

程序13.2 Active0 bjectEngine.java

import java.util.LinkedList;
import java.util.Iterator;

public class ActiveobjectEngine
{
    LinkedList itsCommands = new LinkedList ()
    public void addCommand (Command c)
    {
        itsCommands.add (c);
    }

    public void run ()
    {
        while (!itsCommands.isEmpty ()
        {
            Command c (Command)itsCommands.getFirst ()
            itsCommands.removeFirst ()
            c.execute();
        }
    }
}

程序13,3 Command.java

public interface Command
{
    public void execute() throws Exception;
}

        这似乎没有给人太深刻的印象。但是想象一下如果链表中的一个Command对象会克隆自己并把克隆对象放到链表的尾部,会发生什么呢?这个链表永远不会为空,run()函数永远不会返回。

13.5:结论

        COMMAND模式的简单性掩盖了它的多功能性。COMMAND模式可以应用于多种不同的美妙用途,范围涉及数据库事务操作、设备控制、多线程核心以及GUI的do/undo管理。
        有人认为COMMAND模式不符合面向对象的思维范式(paradigm),因为它对函数的关注超过了类。这也许是真的,但是在实际的软件开发中,COM①MAND模式是非常有用的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1947091.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

20240724----安装git和配置git的环境变量/如何用命令git项目到本地idea

备注参考博客: 1)可以参考博客,用git把项目git到本地 2)可以参考博客vcs没有git 3)git版本更新,覆盖安装 (一)安装git (1)官网下载的链接 https://git-scm.com/downlo…

【轨物方案】新型储能管理系统(EMS)解决方案

储能EMS作为储能系统的大脑,其重要性不言而喻,但是随着储能行业的不断扩大以及对应产品的不断升级,其对应的售后运维变得越来越复杂,储能系统急需配备完善的EMS系统来监控和优化自身的运营状态,同时满足售后运维&#…

LeetCode 热题 HOT 100 (010/100)【宇宙最简单版】

【链表】No. 0206 反转链表 【简单】👉力扣对应题目指路 希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#xf…

Docker-Compose配置zookeeper+KaFka+CMAK简单集群

1. 本地DNS解析管理 # 编辑hosts文件 sudo nano /etc/hosts # 添加以下三个主机IP 192.168.186.77 zoo1 k1 192.168.186.18 zoo2 k2 192.168.186.216 zoo3 k3注:zoo1是192.168.186.77的别名,zoo2是192.168.186.18的别名,zoo3是192.168.186.1…

JavaScript(14)——DOM

Web API 作用:就是使用JS去操作html和浏览器 分类:DOM(文档对象模型)、BOM(浏览器对象模型) DOM DOM是用来呈现以及与任意HTML或XML文档交互的API,简单来说就是操作网页的内容。 DOM树 将H…

Ansible的脚本-----playbook剧本【下】

目录 实战演练六:tags 模块 实战演练七:Templates 模块 实战演练六:tags 模块 可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。 playboo…

secureCRT同时在所有已打开窗口执行命令、mac-os下使用的SecureCRT版本 以及 SecureCRT一段时间不操作没有响应的问题

一、secureCRT命令行工具一次性同时在所有已打开窗口执行命令 公司的服务器比较多,最近因为opcache,上线发布后,需要重启所有的WEB服务器上的php。目前使用的jenkins发布,不过账号安全问题,给jenkins的账号权限受限不能…

【BUG】已解决:IndexError: positional indexers are out-of-bounds

IndexError: positional indexers are out-of-bounds 目录 IndexError: positional indexers are out-of-bounds 【常见模块错误】 【解决方案】 原因分析 解决方法 示例代码 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博…

golang常用的一些 strings函数

1.判断字符串是否包含另一个字符串 strings.Contains str : "exported_provider_example"prefix : "exported_provider"if strings.Contains(str, prefix) {fmt.Println("字符串包含 exported_provider")} else {fmt.Println("字符串不包含…

学习笔记(数据结构:链表 栈)3

fun为回调函数由主函数决定 栈: 栈是限定仅在表尾进行插入和删除操作的线性表。 先进后出、后进先出 栈顶:允许操作的一端 栈底:不允许操作的一端 入栈,出栈。 顺序栈 链式栈 1.创建 CreateSeqStack 2.销毁 DestroySeqStack 3.判断是否为空栈 IsEm…

机器学习(二十一):错误分析、创造数据和迁移学习

一、错误分析 假设交叉验证集一共有500个数据点,模型拟合结果中,有100个数据点有误。 错误分析就是,手动地分析这100个错误数据(或随机选择一些错误数据),根据它们的共同属性、共同特征分类,然…

一文了解论文检索中ESCI与SCI-E的关系

一、SCI与ESCI相关概念 1、SCI SCI全称为Science Citation Index, 简称 SCI 。于1957 年由美国科学信息研究所(Institute for Scientific Information, 简称 ISI)在美国费城创办,是由美国科学信息研究所(ISI)1961年创办出版的引文数据库。SCI收录全世界出版的数、…

深入了解 JMeter 中的响应断言

JMeter 是一个强大的性能测试工具,能够模拟大量用户并发访问网站或应用程序,以便测试其性能和稳定性。在进行性能测试时,我们需要对响应结果进行断言,以确保应用程序或网站的功能和性能符合预期。 JMeter 提供了一套丰富的响应断…

唐山养老院哪家好—安馨医康养中心,让家人放心,老人舒心

随着社会的发展和人口老龄化的加剧,养老问题逐渐成为社会关注的焦点。特别是在面对失能、失智和高龄老人的养老需求时,传统的“养儿防老”观念和家庭护理模式已经难以满足现代家庭的实际需求。因此,越来越多的家庭开始考虑将老人送入专业的养…

【Java】 力扣 跳跃游戏II

目录 题目链接题目描述思路代码 题目链接 45.跳跃游戏II 题目描述 思路 贪心算法:找到能跳到最远的 cover是记录当前能挑到的最远位置 end表示跳到的最远边界 step表示的是跳跃的次数 开始遍历i0,end0,step会step, 循环遍历为…

Docker搭建群晖

Docker搭建群晖 本博客介绍在docker下搭建群晖 1.编辑docker-compose.yml文件 version: "3" services:dsm:container_name: dsmimage: vdsm/virtual-dsm:latestenvironment:DISK_SIZE: "16G"cap_add:- NET_ADMIN ports:- 8080:50…

js引入和使用

ESMAScript标准 语句基础标准 DOM 针对HTML标签,CSS样式的语言部分 Document Object Model BOM 针对浏览器所使用的开发部分 Browser Object Model js引入 script只能写在head或者body中),如果写在html后这种写法本来就是错误的&am…

【C语言】英寸英尺转换米

运行的结果为 我们百度一下 恒明显我们的答案错了,那这个是为什么呢? 问题就出现在计算的地方,c语言规定两个整数计算,那么小数的部分会被丢弃. 如果计算的两个数中有一个数为小数,那么会将两个数都变为小数在进行计算,结果也会是小数. 那么我们现在就有解决办法了. 方法一…

学习记录day18——数据结构 算法

算法的相关概念 程序 数据结构 算法 算法是程序设计的灵魂,结构式程序设计的肉体 算法:计算机解决问题的方法护额步骤 算法的特性 1、确定性:算法中每一条语句都有确定的含义,不能模棱两可 2、有穷性:程序执行一…

【数据结构】顺序表(c语言实现)(附源码)

​ 🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:数据结构 目录 前言 1.顺序表的概念与结构 2.顺序表的分类 3.顺序表的实现 3.1 结构定义及方法的声明 3.2 方法的实现 3.2.1 初始化 3.2.2 销毁 3.2…