命令模式

简介: 1、什么是命令模式?   命令模式(Commond Pattern):将来自客户端的请求封装为一个对象,无需了解这个请求激活的动作或有关接受这个请求的处理细节。命令模式的根本目的在于将“请求者”与“实现者”之间解耦。   其实命令模式和其他许多设计模式一样,就是在请求者和实现者中间加一个中间人的角色,来达到解除耦合的目的。通过对中间人的特殊设置,从而形成不同的设计模式,命令模式也不

1、什么是命令模式?


  命令模式(Commond Pattern):将来自客户端的请求封装为一个对象,无需了解这个请求激活的动作或有关接受这个请求的处理细节。命令模式的根本目的在于将“请求者”与“实现者”之间解耦。

  其实命令模式和其他许多设计模式一样,就是在请求者和实现者中间加一个中间人的角色,来达到解除耦合的目的。通过对中间人的特殊设置,从而形成不同的设计模式,命令模式也不例外。命令模式正是通过一个中间的命令者角色完成请求与实现之间的解耦。


2、命令模式的类图:




  命令模式分为三部分,调用者、接收者和命令类,其实质是在命令发出者和命令接受者之间增加第三方来实现解耦,下面来使用实例来说明。


3、命令模式实例


  需求:使用命令模式完成邮局案例,需要一个发件人、邮局、收件人三种实体对象。发件人投递信件给邮局,邮局需要做的是将信件发给收件人,自始至终,我们都没有让发件人和收件人进行直接通信,也就是说,命令的调用者和接收者是没有联系的,完全通过邮局这个中间人来联系。


  案例类图:


  

  首先创建一个“IReceiver”收件人接口,其中只有一个读取信件的readMail方法:

<span style="font-size:18px;">
/*
 * 功能:命令模式,接收者
 * 		信件接收者
 */
public interface IReceiver {
	public void readMail(String message);
}</span>


  接下来,我们创建收件人类,并实现收件人接口:

<span style="font-size:18px;">
/*
 * 功能:接收者实现类
 */
public class ReceiverImp implements IReceiver {
	
	@Override
	public void readMail(String message) {
		System.out.println("收件人读取信息:"+message);
	}
}</span>


  创建邮局接口IPost,该接口中定义发送信件的方法sendMail:

<span style="font-size:18px;">
/*
 * 功能:邮局接口,即命令接口
 * 		
 */
public interface IPost {
	public void sendMail(String message);
}</span>


  创建邮局实现类,因为邮局需要将信件转发给收件人,所以要保持对收件人的引用:

<span style="font-size:18px;">
/*
 * 功能:邮局接口实现类
 */
public class IPostImp implements IPost {
	// 保持对收件人的引用
	private final IReceiver receiver;
	//通过构造方法传入
	public IPostImp(IReceiver receiver){
		this.receiver = receiver;
	}
	//具体发送功能
	@Override
	public void sendMail(String message) {
		System.out.println("信息已经发送给收件人!");
		receiver.readMail(message);
	}
}</span>


  接下来,我们来创建发送者,因为发送者需要将信件放到邮局,所以要保持对邮局的引用,我们通过构造方法来传入这个引用:

<span style="font-size:18px;">
/*
 * 功能:发送者,即命令调用者
 */
public class Invoker {
	//保留邮局引用
	private IPost ipost;
	//设置邮局对象实例
	public void setPost(IPost ipost){
		this.ipost=ipost;
	}
	//发件人发送信息
	public void postMail(String message){
		System.out.println("发信人开始投递邮件给邮局。。。");
		ipost.sendMail(message);
	}
}</span>


  接下来就是我们的测试类(客户端)了,创建发件人、收件人、邮局实例,然后进行发邮件:

<span style="font-size:18px;">
/*
 * 功能:测试类
 */
public class Test {
	public static void main(String[] args) {
		Invoker in = new Invoker();
		ReceiverImp receiver = new ReceiverImp();
		IPostImp post = new IPostImp(receiver);
		in.setPost(post);
		in.postMail("我来了!");
	}
}</span>


  信件通过邮局发送,而发件人和收件人之间却没有任何联系,这就是命令模式的应用,也是符合迪米特法则(最少知识原则)的,即两个实体之间如果没有必要进行联系的话,那就尽量不要让它们进行直接联系,而是采取中间人的方式对其进行解耦。


  总结:命令模式中,精髓就是请求的启动者发送命令请求给具体命令,由具体命令负责发送命令消息给命令的接收者,具体命令就是模式模式中的中间人角色。


  命令模式的适用场合:

    抽象出待执行的动作以参数化某对象。类似于过程设计中的回调机制,而命令模式正式回调机制的一个面向对象的替代品;

    在不同的时刻指定、排列和执行请求;

    需要支持可撤销的操作;

    需要支持修改日志功能。这样当系统崩溃时,这些修改可以被重做一遍;

需要支持事务系统。




目录
相关文章
|
算法 编译器 数据处理
什么叫下推
`下推`在计算机科学中涉及多种应用:1) 在编译器的下推自动机用于语法分析;2) 栈操作在函数调用与递归中管理返回地址和局部变量;3) 索引下推优化数据库查询性能;4) 事件下推在异步编程和事件驱动架构中处理事件;5) 下推算法在流处理中实现接近数据源的计算,提升流式数据处理效率。
396 2
|
运维 监控
浅析SPI与CAN通信
SPI是一种常用的MCU与外设的通信方式,英文全称Serial Peripheral Interface。与之前介绍过的UART不同,SPI是串行,全双工,同步通信方式。SPI通常有4根物理连接线,分别是CS片选,SCK时钟,MOSI主机输出从机输入和MISO主机输入从机输出。CS片选是从机选择信号线,低电平有效。当CS为低电平时认为主机目前选中的本从机。SCK是串行时钟线,同步通信需要主从机时钟同步,主机利用SCK线与从机实现时钟同步。时钟由主机产生,决定了通讯的速率。
560 0
|
5月前
|
人工智能 IDE 搜索推荐
惊!GitHub Copilot或将颠覆传统编程,程序员即将失业?
GitHub Copilot引爆编程界!这个AI编程神器将彻底改变你的编程生涯!
218 22
惊!GitHub Copilot或将颠覆传统编程,程序员即将失业?
|
6月前
|
自然语言处理 安全 开发工具
分享一个纯净无广、原版操作系统、开发人员工具、服务器等资源免费下载的网站
分享一个纯净无广、原版操作系统、开发人员工具、服务器等资源免费下载的网站
283 4
|
9月前
|
机器学习/深度学习 存储 人工智能
【AI系统】卷积操作原理
本文详细介绍了卷积的数学原理及其在卷积神经网络(CNN)中的应用。卷积作为一种特殊的线性运算,是CNN处理图像任务的核心。文章从卷积的数学定义出发,通过信号处理的例子解释了卷积的过程,随后介绍了CNN中卷积计算的细节,包括卷积核、步长、填充等概念。文中还探讨了卷积的物理意义、性质及优化手段,如张量运算和内存布局优化。最后,提供了基于PyTorch的卷积实现示例,帮助读者理解和实现卷积计算。
524 31
【AI系统】卷积操作原理
|
10月前
|
机器学习/深度学习 存储 人工智能
【AI系统】计算之比特位宽
本文详细介绍了计算机中整数和浮点数的比特位宽概念及其在AI模型中的应用。通过对比特位宽的定义、整数与浮点数的表示方法、AI中常用的数据类型(如FP32、TF32、FP16、BF16、FP8和Int8)及其在模型训练和推理中的作用进行了阐述。特别关注了FP8数据类型在提高计算性能和减少内存占用方面的新进展,以及降低比特位宽对AI芯片性能的影响,强调了低比特位宽在AI领域的重要性。
289 0
|
人工智能 机器人 vr&ar
Midjourney高效使用技巧总结(二)
这篇文章总结了Midjourney AI绘画工具的高效使用技巧,包括常用指令/参数、实操案例和参考网站,帮助用户更好地掌握如何使用Midjourney进行艺术创作。
Midjourney高效使用技巧总结(二)
|
11月前
|
存储 监控 NoSQL
MongoDB在不同行业中的广泛应用
MongoDB在不同行业中的广泛应用
398 3
|
消息中间件 Prometheus 监控
统一观测|Prometheus 监测 RocketMQ
RocketMQ 如何接入 PrometheusRocketMQ 诞生于阿里内部的核心电商系统,是业务消息的首选 MQ 平台。上图是 RocketMQ 5.0 的系统全貌,在接入层、核心组件和底层运维方面做了非常大的改进,具有功能多样、高性能、高可靠、可观测、易运维等众多优势。Metrics、Tra...
389 1
统一观测|Prometheus 监测 RocketMQ
|
安全 编译器 C语言
C++内联函数:那时我还太年轻,并不知道使用inline带来的效率,早已在暗中标好了价格
C++内联函数:那时我还太年轻,并不知道使用inline带来的效率,早已在暗中标好了价格
C++内联函数:那时我还太年轻,并不知道使用inline带来的效率,早已在暗中标好了价格