`

设计模式学习笔记——命令模式

阅读更多

 

命令模式

属于行为模式

命令模式将一个请求或者操作封装到一个命令对象中。允许系统使用不同的请求将客户端参数化,对请求排队或者记录请求日志,提供命令的撤销,恢复能力

 

由于请求方和接收方被命令对象相对分割,从而有了下面这些优点

1 命令模式使新的命令很容易被加入

2 允许接受请求方否决请求

3 可较容易地设计一个命令队列

4 可以实现对请求的Undo,Redo

5 可以将命令计入日志

 

类图一枚

命令模式设计5个角色

客户角色Client:客户端,创建命令并确定接收对象

命令角色Command:所有具体命令的抽象接口

具体命令角色ConcreteCommand:接受者与行为之间的联系,调用接受者相关操作

请求者角色Invoker:调用命令对象执行请求

接受者角色Receiver:具体实施动作

 

下面是最简单的命令模式

首先是抽象的Command以及一个具体的ConcreteCommand,可以看到其中只定义实现了一个execute方法,ConcreteCommand持有一个接受者对象,execute方法实际是调用receiver中的action方法。

 

public interface Command {
	public void execute();
}
public class ConcreteCommand implements Command{
	private Receiver receiver;
	public void setReceiver(Receiver receiver){
		this.receiver=receiver;
	}
	@Override
	public void execute() {
		receiver.action();
	}
}
  

Receiver对象,其中只有action方法,即表示实际需要进行的动作

 

public class Receiver {
	public void action(){
		System.out.println("Reciever has done the Action");
	}
}
 

Invoker请求者对象,持有具体要委派的命令,并调用命令的execute方法

 

public class Invoker {
	private Command command;
	public void setCommand(Command command){
		this.command=command;
	}
	public void runCommand(){
		command.execute();
	}
}
 

客户端只是负责创建命令和确定接受者,其中的连接由各自完成。

 

public class Client {
	public static void main(String[] args) {
		Receiver receiver=new Receiver();
		ConcreteCommand command=new ConcreteCommand();
		command.setReceiver(receiver);
		Invoker invoker=new Invoker();
		invoker.setCommand(command);
		invoker.runCommand();
	}
}
 

最终可以看到输出了一行结果:

Reciever has done the Action

 

其实从上面的调用过程中就可以清楚的看到命令模式的整个运行过程

1 客户端创建命令对象,指明接受者

2 请求者对象保存命令

3 请求者对象通过runCommand发出请求,在这之中,可以在命令角色中通过一个状态变量控制undo redo或者其他操作的控制

4 命令对象调用接收者方法执行操作

 

在上面的例子并没有体现出关于undo,redo的功能

而如果需要这类功能,同样是在ConcreteCommand中进行处理,例如添加一个List来记录前后操作,并在执行时更新。

 

命令模式有一个比较明显的缺点,就是当命令数量比较多时,会产生相当数量的ConcreteCommand具体命令类。

 

总体来说命令模式即是由原来的请求-接收中间添加了一个命令对象,通过命令对象实现了两者间的解耦,并添加某种程度的控制和记录。

 

http://www.cnblogs.com/sjms/archive/2010/07/16/1778527.html

上面的博客中有关于undo的一个简单实现,应该说研磨设计模式是写得非常浅显易懂的,包括其中其他的部分 推荐一看

  • 大小: 4.3 KB
分享到:
评论

相关推荐

    树莓派学习笔记——wiringPi GPIO使用详解.docx

    《树莓派学习笔记——wiringPi GPIO使用详解》 在树莓派的探索与学习过程中,GPIO(General Purpose Input/Output)接口是极其重要的部分,它允许我们直接与外部硬件进行交互。wiringPi是一个专为树莓派设计的C语言...

    我的学习笔记——J2EE

    3. 配置web.xml文件,这是Servlet容器的部署描述符,它定义了Servlet的映射关系,包括servlet名称、servlet类全名,以及URL模式。例如,配置一个名为IpLogServlet的Servlet,其对应的类是`tarena.servlet.lc....

    一点学习笔记——关于嵌入式学习的起点

    这篇学习笔记主要关注的是在嵌入式领域中初学者应该掌握的基础知识,尤其是与Linux环境和C语言相关的技能。 首先,从Linux环境和命令开始。Linux是嵌入式系统常用的操作系统,常见的发行版有Debian、Ubuntu和Redhat...

    sd卡中文学习笔记

    **SD卡中文学习笔记——深度解析** SD卡,即Secure Digital Memory Card,是一种基于闪存技术的便携式存储介质,广泛应用于各种电子设备中,如数码相机、智能手机、平板电脑等,尤其在硬件开发领域,对于新手而言,...

    软件设计师软考笔记.zip

    这份压缩包包含了博主在学习过程中记录的详细笔记,以及一份精心整理的设计模式表格,旨在帮助备考者系统、高效地掌握相关知识。 首先,我们来探讨一下“软考”——这是一项国家级的专业技术资格认证考试,旨在评测...

    Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计(csdn)————程序.pdf

    对于没有真实生产环境的学习者,可以通过阅读文档、模拟实践和参与社区讨论来提升技能。同时,其他技术如 JVM、Netty、Tomcat、Mysql、Spring、Mybatis、Nginx、Zookeeper 和 RabbitMQ 等也是面试中常见的考察点。

    WPF Sliverlight最新学习笔记

    或者WPF与MVVM(Model-View-ViewModel)设计模式的配合,以提高代码的可测试性和可维护性。 **WPF学习笔记.docx**文档可能深入探讨了WPF的具体技术细节,如动画、效果、数据可视化、控件扩展等,并包含实践案例和...

    LaTex教程--latex排版学习笔记---入门提高.zip

    《LaTeX教程——LaTeX排版学习笔记——入门提高》是一个专门为初学者设计的资源包,旨在帮助读者快速掌握LaTeX这一强大的文本处理系统。LaTeX是一种基于TeX的文字处理系统,广泛应用于科研、教育和工程领域,尤其在...

    java学习笔记

    ### Java学习笔记知识点详解 #### Java 平台与开发概述 - **Java平台分类:** - **J2SE(Java SE):** 标准版,适用于桌面应用程序开发。 - **J2EE(Java EE):** 企业版,专为Web应用和服务端应用程序设计。 -...

    SD卡学习笔记

    ### SD卡学习笔记知识点详解 #### 一、概述 **SD卡**是一种基于闪存技术的存储卡,广泛应用于各种移动设备中,如手机、数码相机等。它具有体积小、重量轻、功耗低等特点,是现代便携式电子设备不可或缺的一部分。 ...

    Java学习笔记相关

    以上只是Java学习笔记中可能涵盖的部分主题,实际的学习过程中还会有更多深入的内容,如设计模式、并发编程、数据库连接、网络编程、GUI开发、Spring框架等。持续学习和实践将帮助你逐步掌握这个强大且广泛使用的...

    Oracle学习笔记

    ### Oracle学习笔记精要 #### 一、Oracle安装与配置 **1.1 安装注意事项** 在安装Oracle过程中,特别注意的是Oracle Universal Installer(OUI)会在操作系统中自动安装适用于Oracle版本的Java运行环境(JRE)。...

    C、C++、Qt、Linux、ARM、数据结构等学习笔记.zip

    这些学习笔记涵盖了一系列重要的计算机科学和技术领域,包括基础编程语言C和C++,GUI开发库Qt,操作系统Linux,以及嵌入式系统中的ARM架构,还有核心的计算机科学概念——数据结构。下面,我将深入解释这些主题的...

    appfuse学习笔记(二)新建模块

    在本篇“appfuse学习笔记(二)新建模块”中,我们将深入探讨AppFuse框架的模块创建过程。AppFuse是一个开源项目,它提供了一个快速开发Web应用的基础结构,旨在简化开发流程并提高代码质量。通过AppFuse,开发者...

    LaTeX 学习笔记v2.0

    ### LaTeX 学习笔记v2.0 知识点概览 #### 1. 历史回顾与技术进步 - **页面描述语言**: 页面描述语言(Page Description Language, PDL)是一种用来描述文档外观的语言,它使得文档可以被打印机或显示设备精确地...

    2010年职称计算机考试PowerPoint2003学习笔记.pdf

    以上就是关于2010年职称计算机考试中PowerPoint 2003的学习笔记,涵盖了文件操作、创建文件、使用向导、保存格式以及母版设置等多个方面,这些内容对于准备考试和日常使用PowerPoint 2003的用户都非常实用。

    偌依框架的使用学习笔记

    ### 偌依框架的使用学习笔记 #### 一、若依框架的介绍与说明 若依框架是一款基于Spring Boot、Spring Security、JWT、Vue和Element的全开源快速开发平台,旨在提供高效的前后端分离解决方案。它具备以下特点: 1....

    【嵌入式学习笔记二】烧录制作好的镜像到4412开发板中

    在嵌入式系统的学习过程中,烧录镜像到开发板是一项基础且关键的操作,它涉及到嵌入式系统开发流程中的一个核心步骤——将操作系统和应用程序固化到硬件设备中去。本知识点将以iTOP-4412开发板为例子,结合Android和...

Global site tag (gtag.js) - Google Analytics