命令模式

简介: 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>


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


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


  命令模式的适用场合:

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

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

    需要支持可撤销的操作;

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

需要支持事务系统。




目录
相关文章
|
4月前
|
弹性计算 安全 Linux
esc使用体验心得
在我看来云服务器有以下优点:省力,不需要专门花时间去维护服务器的硬件,看服务器是否运行正常;稳定,这应该是最主要的有点;安全,做web开发最怕的当然是攻击,所以选择大厂的服务器,自然是最香的;省钱,这当然也是很重要的,尤其对于我们学生用户还是很友好的,爆赞!
|
Java Maven
org.yaml.snakeyaml.scanner.ScannerException: while scanning for the next token found character ‘@‘ t
org.yaml.snakeyaml.scanner.ScannerException: while scanning for the next token found character ‘@‘ t
1209 0
|
Java 网络安全 数据安全/隐私保护
【Java异常】Unrecognized SSL message, plaintext connection?https请求遇到异常分析
【Java异常】Unrecognized SSL message, plaintext connection?https请求遇到异常分析
1890 0
|
弹性计算 Linux 云计算
ESC使用体验
这是本人一次ESC服务器的使用体验
|
Ubuntu 网络安全 数据安全/隐私保护
esc使用体验
esc使用体验和记录
|
JSON Cloud Native Go
gRPC-GateWay Swagger 实战
gRPC-GateWay Swagger 实战
104 1
|
存储 弹性计算 固态存储
Esc使用体验
Esc使用体验
|
弹性计算 Linux
关于esc的使用体验
很高兴在这里发表一篇文章来跟大家分享我最近使用ECS的体验感受,希望大家喜欢,我是一名计算机网络专业的学生,因为自己所学的方向是需要用服务器来进行实际操作的,所以我在我老师的推荐下,在阿里云上找到了一ECS服务器来给结合项目实操。而却学生党还可以免费领,只需完成上面的任务就可以,实在很人性化啦!这个飞天加速计划·高校学生在家实践活动,太为学生党贴心策划了,很感谢这次活动。我在这款服务器里使用使我学习上也得到一定帮助,因为我们学校的课程也开设了linux课程,学的也不是很巩固,同时也了解了一些云服务器的知识,想要拥有一台服务器。通过对ECS云服务器的使用让我巩固了Linux命令,同时也掌握了一些
|
弹性计算 安全 Linux
esc使用体验心得esc使用体验心得
在我看来云服务器有以下优点:省力,不需要专门花时间去维护服务器的硬件,看服务器是否运行正常;稳定,这应该是最主要的有点;安全,做web开发最怕的当然是攻击,所以选择大厂的服务器,自然是最香的;省钱,这当然也是很重要的,尤其对于我们学生用户还是很友好的,爆赞!
|
应用服务中间件 Linux 网络安全
ESC使用体验心得
我是通过老师的推荐了解了飞天加速计划,并进行了领取和学习。使用之后感觉阿里云非常友好,领取之前还会有一个教程和简单的测试,以便更好的使用。领取服务器之后,立马连接上使用了。在我看来云服务器有以下优点:简单,省力,服务器稳定,而且安全性高,对于我们学生党来说真是太友好了