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

server/2024/10/20 5:39:39/

  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.javaimport 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.javapublic interface Command
{public void execute() throws Exception;
}

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

13.5:结论

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


http://www.ppmy.cn/server/90268.html

相关文章

2024.7.24(反向解析、时间同步、主从架构)

[rootclient ~]# systemctl stop NetworkManager [rootclient ~]# systemctl disable NetworkManager 一、配置反向解析 1、配置zone文件 [rootdns named]# vim /etc/named.rfc1912.zones [rootdns named]# ls [rootdns named]# cp -p named.loopback 192.168.8.zone [rootd…

GAMES104:05游戏引擎中的渲染系统2:渲染中的光照、材质和shader-学习笔记

文章目录 一、渲染方程及其挑战二、基础光照解决方案-简化版简化光源简化材质简化阴影 三、基于预计算的全局光照3.1挑战和计算思路傅里叶变换球谐函数(Spherical Harmonics) 3.2 SH Lightmap:预计算 GI3.3 探针 Probe:Light Prob…

The Llama 3 Herd of Models.Llama 3 模型论文全文

现代人工智能(AI)系统是由基础模型驱动的。本文提出了一套新的基础模型,称为Llama 3。它是一组语言模型,支持多语言、编码、推理和工具使用。我们最大的模型是一个密集的Transformer,具有405B个参数和多达128K个tokens的上下文窗口。本文对Llama 3进行了广泛的实证评价。我们…

Vscode——如何快速搜索项目工程中的某个文件的位置

第一步:按 shift ctrl p 第二步:然后把 > 删除 第三步:输入文件名称即可

实战:Redis实现排行榜、点赞和关注功能的基本操作

Redis是一款高性能的内存数据库,以其极快的读写速度和丰富的数据结构广泛应用于各种互联网服务中。本文将介绍如何基于Redis实现排行榜、点赞和关注功能,并提供相应的代码示例。 实战:Redis性能测试、调优和使用规范-CSDN博客 规范&#xf…

如何撤销/回滚远程修改

1. git revert 通过git revert commit_id,撤销指定commit,然后push到远程分支,即可撤销指定commit的修改,并新增一个revert的提交记录。 2. 撤销HEAD的修改并删除提交记录 git reset --hard HEAD^ # 撤销最近一次的修改 git pu…

PHP Filesystem 简介

PHP Filesystem 简介 PHP 是一种广泛使用的开源服务器端脚本语言,特别适用于网页开发。在 PHP 中,Filesystem 是一个功能丰富的库,提供了一系列用于文件系统操作的函数。这些函数允许开发者读取、写入、修改和删除文件和目录,以及…

OpenCV 图像预处理—图像金字塔

文章目录 相关概念高斯金字塔拉普拉斯金字塔应用 构建高斯金字塔为什么要对当前层进行模糊?1. 平滑处理2. 减少混叠(Aliasing)3. 多尺度表示4. 图像降采样 举个栗子创建高斯金字塔和拉普拉斯金字塔,并用拉普拉斯金字塔恢复图像 相…