《图解设计模式》笔记(十)用类来表现

news/2025/2/15 7:35:12/

二十二、Command模式:命令也是类

一个类调用某方法,虽然调用结果会反映在对象的状态中,但不会留下工作的历史记录。
若有一个类表示“请进行这项工作”的“命令”,每一项想做的工作就不再是“方法的调用”这种动态处理了,而是一个表示命令的类的实例,即可以用“物”来表示。
想管理工作的历史记录,只需管理这些实例的集合即可,且还可以随时再次执行过去的命令,或是将多个过去的命令整合为一个新命令并执行。
设计模式中,称这样的“命令”为Command模式。
Command有时也被称为事件(event)。它与“事件驱动编程”中的“事件”是一样的意思。当发生点击鼠标、按下键盘按键等事件时,可以先将这些事件作成实例,然后按照发生顺序放入队列中。接着,再依次去处理它们。

示例程序
是一个画图软件,它的功能很简单,即用户拖动鼠标时程序会绘制出红色圆点,点击clear按钮后会清除所有的圆点。
用户每拖动一次鼠标,应用程序都会为“在这个位置画一个点”这条命令生成一个DrawCommand类的实例。
只要保存了这条命令,以后有需要时就可以重新绘制。

示例程序的运行结果

在这里插入图片描述

示例程序类图

在这里插入图片描述

Command

package command;public interface Command {public abstract void execute();
}

MacroCommand

package command;import java.util.Stack;
import java.util.Iterator;public class MacroCommand implements Command {// 命令的集合// 虽然这里也可以使用java.util.ArrayList类型,但为了能轻松地实现undo方法,还是决定使用java.util.Stack类型private Stack commands = new Stack();// execute方法应该进行什么处理呢?// 既然要运行多条命令,那么只调用commands字段中各个实例的execute方法不就可以了吗?这样,就可以将MacroCommand自己保存的所有 Command全部执行一遍。// 不过,如果while循环中要执行的 Command又是另外一个MacroCommand类的实例,该实例中的execute方法也是会被调用的。因此,最后的结果就是所有的Command全部都会被执行。// 执行public void execute() {Iterator it = commands.iterator();while (it.hasNext()) {((Command)it.next()).execute();}}// 添加命令public void append(Command cmd) {// 防止不小心将自己(this)添加进去,否则execute方法将会陷入死循环if (cmd != this) {// java.util.Stack类的push方法,它会将元素添加至java.util.Stack类的实例的末尾commands.push(cmd);}}// 删除最后一条命令public void undo() {if (!commands.empty()) {// java.util.Stack类的pop方法,它会将push方法添加的最后一条命令取出来,并从Stack类的实例中移除commands.pop();}}// 删除所有命令public void clear() {commands.clear();}
}

DrawCommand

package drawer;import command.Command;
import java.awt.Point;public class DrawCommand implements Command {// 绘制对象protected Drawable drawable;// 绘制位置private Point position;// 构造函数// 接收两个参数:Drawable的实现类,Point类,分别保存在drawable字段和position字段中。它的作用是生成“在这个位置绘制点”的命令。public DrawCommand(Drawable drawable, Point position) {this.drawable = drawable;this.position = position;}// 执行public void execute() {drawable.draw(position.x, position.y);}
}

Drawable

package drawer;public interface Drawable {public abstract void draw(int x, int y);
}

DrawCanvas

package drawer;import command.*;import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;public class DrawCanvas extends Canvas implements

http://www.ppmy.cn/news/1572181.html

相关文章

Spring Boot应用开发

一、了解Spring Boot Spring Boot是一个基于Spring框架的开源Java基础框架,它可以帮助我们快速开发独立的、基于生产级的基于Spring框架的应用程序。简单来说,它就像是一个“超级助手”,帮你把很多复杂的配置都简化了,让你能更轻…

基于Swift实现仿IOS闹钟

仿 iOS 系统闹钟 添加闹钟效果图 收到通知效果图 更新日志 2018.09.12 由于 iOS 系统限制了注册本地推送的数量,最大的注册量为 64 条,且一旦超出 64 条,所有的推送都将失效,故而在添加推送的时候做了一个判断,超过…

Java 大视界 -- 人工智能驱动下 Java 大数据的技术革新与应用突破(83)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

KVM和OpenVZ的区别以及如何选择

KVM 和 OpenVZ 是目前市面上最为常见的两种虚拟化技术,两者各有其优缺点。了解这两者的区别能够帮助您挑选更加适合自身需求的VPS,本文中,我们就来从各个角度对比一下这两种技术,并提供一些选择上的建议。 什么是虚拟化&#xff…

DeepSeek本地化部署【window下安装】【linux下安装】

一、window 本地安装指导 1.1、下载window安装包 https://ollama.com/download/OllamaSetup.exe 1.2、点击下载好的安装包进行安装 检测安装是否成功: C:\Users\admin>ollama -v ollama version is 0.5.7有上面的输出,则证明已经安装成功。 配置…

物联网(IoT)如何与人工智能(AI)的结合

物联网(IoT)与人工智能(AI)的结合是当前技术发展的重要趋势,通常被称为 AIoT(人工智能物联网)。这种结合通过将AI的计算能力和数据分析能力与物联网的海量设备连接能力相结合,实现了…

从VGG到Transformer:深度神经网络层级演进对模型性能的深度解析与技术实践指南

一、技术原理(数学公式示意图) 1. 层深与模型容量关系 数学表达:根据Universal Approximation Theorem,深度网络可表达复杂函数: f ( x ) f L ( f L − 1 ( ⋯ f 1 ( x ) ) ) f(x) f_L(f_{L-1}(\cdots f_1(x))) f…

微软AutoGen高级功能——Memory

介绍 大家好,博主又来给大家分享知识了。这次又要给大家分享什么呢?哈哈。这次要给大家分享的是微软AutoGen框架的高级且重要的功能:Memory。在微软AutoGen中,Memory(记忆)是一个重要概念,它主要用于存储和管理智能体…