设计模式之-命令模式(Command Pattern)

命令模式(Command Pattern)是用来实现在一个请求 - 响应模型松耦合。在命令模式中,请求被发送给调用者和调用它传递给被封装的命令对象。 Command对象将请求传递到接收器的适当的方法来执行特定操作。客户端程序创建接收器对象,然后将其连接到命令。然后,它会创建调用对象和附加命令对象执行的操作。现在,当客户端程序执行的操作,它是基于命令和接收对象的处理。

我们将着眼于真实的生活场景,我们可以实现Command模式。比方说,我们希望提供一个文件系统工具与具体操作文件的打开,写入和关闭文件功能,它应该支持多种操作系统,如Windows和Unix。

为了实现我们的文件系统工具,首先我们需要创建一个接收器类实现以上所有的工作。由于我们在Java依据接口设计,我们可以有FileSystemReceiver接口和它的实现类实现不同的操作系统,如Windows,UNIX的Solaris等


FileSystemReceiver.java

package com.journaldev.design.command;public interface FileSystemReceiver {void openFile();void writeFile();void closeFile();
}

FileSystemReceiver接口定义了实现类实现规则方法,为了简单,我只创建了windows,linux两个接收器。

UnixFileSystemReceiver.java

package com.journaldev.design.command;public class UnixFileSystemReceiver implements FileSystemReceiver {@Overridepublic void openFile() {System.out.println("Opening file in unix OS");}@Overridepublic void writeFile() {System.out.println("Writing file in unix OS");}@Overridepublic void closeFile() {System.out.println("Closing file in unix OS");}}

WindowsFileSystemReceiver.java

package com.journaldev.design.command;public class WindowsFileSystemReceiver implements FileSystemReceiver {@Overridepublic void openFile() {System.out.println("Opening file in Windows OS");}@Overridepublic void writeFile() {System.out.println("Writing file in Windows OS");}@Overridepublic void closeFile() {System.out.println("Closing file in Windows OS");}}

conmand接口设计与实现:

我们可以使用接口或抽象类实现,具体实现取决于你的需求,这里我仍使用接口实现

package com.journaldev.design.command;public interface Command {void execute();
}

现在,我们需要创建实现所有不同类型的action由接收器进行的,因为我们有三个acton,我们将创建三个命令实现,每个命令执行将请求转发到接收器的适当的方法。

OpenFileCommand.java

package com.journaldev.design.command;public class OpenFileCommand implements Command {private FileSystemReceiver fileSystem;public OpenFileCommand(FileSystemReceiver fs){this.fileSystem=fs;}@Overridepublic void execute() {//open command is forwarding request to openFile methodthis.fileSystem.openFile();}}

CloseFileCommand.java

package com.journaldev.design.command;public class CloseFileCommand implements Command {private FileSystemReceiver fileSystem;public CloseFileCommand(FileSystemReceiver fs){this.fileSystem=fs;}@Overridepublic void execute() {this.fileSystem.closeFile();}}

WriteFileCommand.java

package com.journaldev.design.command;public class WriteFileCommand implements Command {private FileSystemReceiver fileSystem;public WriteFileCommand(FileSystemReceiver fs){this.fileSystem=fs;}@Overridepublic void execute() {this.fileSystem.writeFile();}}

现在接收器与Conmand实现已完成,下面实现调用类。

调用是封装的命令和请求传递给命令对象来处理它一个简单的类。

FileInvoker.java

package com.journaldev.design.command;public class FileInvoker {public Command command;public FileInvoker(Command c){this.command=c;}public void execute(){this.command.execute();}
}

FileSystemReceiverUtil.java

package com.journaldev.design.command;public class FileSystemReceiverUtil {public static FileSystemReceiver getUnderlyingFileSystem(){String osName = System.getProperty("os.name");System.out.println("Underlying OS is:"+osName);if(osName.contains("Windows")){return new WindowsFileSystemReceiver();}else{return new UnixFileSystemReceiver();}}}

下面创建客户端类使用我们的文件系统Util

FileSystemClient.java

package com.journaldev.design.command;public class FileSystemClient {public static void main(String[] args) {//Creating the receiver objectFileSystemReceiver fs = FileSystemReceiverUtil.getUnderlyingFileSystem();//creating command and associating with receiverOpenFileCommand openFileCommand = new OpenFileCommand(fs);//Creating invoker and associating with CommandFileInvoker file = new FileInvoker(openFileCommand);//perform action on invoker objectfile.execute();WriteFileCommand writeFileCommand = new WriteFileCommand(fs);file = new FileInvoker(writeFileCommand);file.execute();CloseFileCommand closeFileCommand = new CloseFileCommand(fs);file = new FileInvoker(closeFileCommand);file.execute();}}

程序输出:

Underlying OS is:Mac OS X
Opening file in unix OS
Writing file in unix OS
Closing file in unix OS

类结构视图:



要点总结:

命令是这种模式,它定义了规则执行核心。
接收机的实现是由分开的命令执行。
命令实现类选择的方法来调用接收对象,每个方法的接收器会有一个命令执行。它的工作原理是接收器和行动方法之间的桥梁。
调用类从客户端获取请求,将命令对象转发。
客户端负责实例化相应的命令并接收执行,然后将它们联系到一起。
客户端还负责调用实例化对象,并与之关联的命令对象,并执行该操作方法。
Command模式很容易扩展的,我们可以在接收器中添加新的操作方法,并创建新的命令的实现在不改变客户端代码。
command模式的缺点是代码量是巨大的,因为这么多的关联和混乱有大量的动作和方法。







转载于:https://www.cnblogs.com/happyxiaoyu02/p/6818938.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292953.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android -上传文件到服务器

android上传文件到服务器 重点:最好是设置好content-type这些参数的配置! package com.spring.sky.image.upload.network; import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.Inp…

梯度下降法、随机梯度下降法、批量梯度下降法及牛顿法、拟牛顿法、共轭梯度法

http://ihoge.cn/2018/GradientDescent.html http://ihoge.cn/2018/newton1.html 引言 李航老师在《统计学习方法》中将机器学习的三要素总结为:模型、策略和算法。其大致含义如下: 模型:其实就是机器学习训练的过程中所要学习的条件概率…

浅谈.NET 6 中 gRPC 的最新功能

gRPC 是一个现代的、跨平台的、高性能的 RPC 框架。gRPC 是构建在 ASP.NET Core 之上,也是我们推荐的使用 .NET 构建 RPC 服务的方法。.NET 6 进一步提高了 gRPC 已经非常出色的性能,并添加了一系列新功能,使 gRPC 在现代云原生应用程序中比以…

如果你没有时间读书,至少要保留这个习惯

全世界只有3.14 % 的人关注了爆炸吧知识快节奏的生活中,如何花费少量的时间,就可以让自己的生活发生好的改变?知乎上有一个高赞回答:大量阅读优质文章。见识决定了你的眼界,站得越高,看得越多,你…

python引入模块时import与from ... import的区别

import datetime是引入整个datetime包,如果使用datetime包中的datetime类,需要加上模块名的限定。 1 import datetime 2 3 print datetime.datetime.now() 如果不加模块名限定会出现错误:TypeError: module object is not callable \ AttributeError: m…

基于python的随机森林回归实现_随机森林理论与python代码实现

1,初品随机森林 随机森林,森林就是很多决策树放在一起一起叫森林,而随机体现在数据集的随机采样中和特征的随机选取中,具体下面再讲。通俗的说随机森林就是建立多颗决策树(CART),来做分类(回归&…

Linux之dd命令详解

Linux-dd命令详解 dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。 名称: dd 使用权限: 所有使用者dd 这个指令在 manual 里的定义是 convert and copy a file 使用方式: dd [option]…

C++ 标准模板库

转载于:https://www.cnblogs.com/Flyzhcong/p/3977865.html

.NET Conf 2021 回顾

.NET Conf 2021是有史以来规模最大的.NET Conf,全球演讲者举办了80多场会议!我们非常感谢所有收看直播、在分享会上的提问、参与我们的乐趣和游戏的人。学习将持续到1月底,社区活动将持续进行,所以一定要查看这些活动,并关注我们的会议 GitHu…

男厕改女厕能多敷衍......

1 搓澡时最好不要闲聊(素材来源网络,侵删)▼2 弟弟需要充电多久才能回家?(素材来源网络,侵删)▼3 这都什么野史?▼4 脚崴了怎么办?▼5 钥匙在老地方▼6 被红绿灯伤透…

shell之什么时候使用shell以及最简单的shell程序

因为Shell似乎是各UNIX系统之间通用的功能,并且经过了POSIX的标准化。因此,Shell脚本只要“用心写”一次,即可应用到很多系统上。因此,之所以要使用Shell脚本是基于: 简单性:Shell是一个高级语言&#xff…

《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)...

最新的效果见 :http://video.sina.com.cn/v/b/124538950-1254492273.html 可处理视频的示例:视频去雾效果 在图像去雾这个领域,几乎没有人不知道《Single Image Haze Removal Using Dark Channel Prior》这篇文章,该文是2009年C…

python 运算符重载_Python3面向对象-运算符重载

1:运算符重载介绍运算符重载,就是在某个类的方法中,拦截其内置的操作(比如:,-,*,/,比较,属性访问,等等),使其实例的行为接近内置类型。当类的实例出现在内置操…

docker Failed to get D-Bus connection 报错

在centos7的容器里面出现了一个BUG,就是serveice启动服务的时候出现报错,不能用service启动服务。[roote13c3d3802d0 /]# service httpd startRedirecting to /bin/systemctl start httpd.serviceFailed to get D-Bus connection: Operation not permit…

牛顿法、拟牛顿法、高斯-牛顿法、共轭梯度法推导总结

原文:http://ihoge.cn/2018/newton1.html 前言: 线性最小二乘问题,我们可以通过理论推导可以得到其解析解,但是对于非线性最小二乘问题,则需要依赖迭代优化的方法,牛顿算法是解决非线性最优的常见算法之一…

WD 蓝盘、绿盘、黑盘、红盘的区别

绿盘,蓝盘、黑盘和红盘是西部数据根据旗下所产硬盘的特点所做的分类,通俗点讲:所谓的黑盘、蓝盘、绿盘、红盘就是指的西部数据硬盘上贴的那张纸,是黑色、蓝色、绿色、或红色。 黑盘:高性能,大缓存&#xff…

不用变量交换2个值

题目: 不使用变量交换2个值 代码如下: #include <iostream> using namespace std;int main() { int a = 3;int b = 4;cout<<"a="<<a<<endl;cout<<"b="<<b<<endl;a = a ^ b;b = a ^ b;a = a ^ b;cout<&…

基于事件驱动架构构建微服务第16部分:Azure Active Directory B2C

原文链接: https://logcorner.com/building-micro-services-through-event-driven-architecture-part16-azure-active-directory-b2c/在本教程中&#xff0c;我将展示如何通过使用Azure AD B2C启用Oauth2和OpenId Connect来保护微服务。Azure Active Directory B2C将B2C身份认证…

SAP basis事务代码笔记

SU01 用户维护&#xff0c;可创建、删除、编辑、解锁/锁定、修改密码SU03 Maintain Authorization 配置权限&#xff08;基于权限对象authorization object&#xff09;SU10 Mass Changes to User Master Records 对用户主记录的大量修改&#xff0c;批量维护账号用。SU12 Ma…