-
2021-09-26 07:53:09
命令模式
命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也可支持可撤销的操作。
在客厅的进门处有一个开关面板,该面板上有两个开关,第一个开关是打开客厅的灯,第二个开关是打开客厅的电视。下面就来具体实现一下。电视与灯类: public class Light { String location = ""; public Light(String location) { this.location = location; } public void on() { System.out.println("打开"+location+"的灯"); } public void off() { System.out.println("关闭"+location+"的灯"); } }
public class Television { public void open() { System.out.println("打开电视"); } public void close() { System.out.println("关闭电视"); } }
硬编码的方式实现开关面板功能
//开关控制器 public class SwitchControlOld { Light light = new Light("客厅"); Television television = new Television(); public void onButtonWasPressed(int solt) { //打开第一个开关 if(solt==0){ light.on(); }else if(solt==1){ television.open(); } } public void offButtonWasPressed(int solt) { //关闭第一个开关 if(solt==0){ light.off(); }else if(solt==1){ television.close(); } } }
从上面可以看到,实现得十分的不友好,如果开关面板上再加个开关按钮就必须得再加一组判断。而且,开关控制面板跟具体的电器开关逻辑强耦合。
使用命令模式重新实现该逻辑//可以理解为这里为转接口的定义 public interface Command { //运行 public void execute(); //回退 public void undo(); }
//开灯命令 public class LightOnCommand implements Command { Light light; public LightOnCommand(Light light) { this.light = light; } public void execute() { light.on(); } @Override public void undo() { // TODO Auto-generated method stub light.off(); } }
```java //关灯命令 public class LightOffCommand implements Command { Light light; public LightOffCommand(Light light) { this.light = light; } public void execute() { light.off(); } @Override public void undo() { // TODO Auto-generated method stub light.on(); } }
//打开电视 public class TelevisionOnCommand implements Command { Television television; public TelevisionOnCommand(Television television) { this.television = television; } @Override public void execute() { television.open(); } @Override public void undo() { television.close(); } }
//关闭电视 public class TelevisionOffCommand implements Command { Television television; public TelevisionOffCommand(Television television) { this.television = television; } @Override public void execute() { television.close(); } @Override public void undo() { television.open(); } }
使用命令模式实现的开关控制器 //开关控制器 public class SwitchControl { Command[] onCommands = new Command[2]; Command[] offCommands = new Command[2]; //把开关与具体要干的事情关联起来 public void setCommand(int solt,Command onCommand,Command offCommand) { onCommands[solt] = onCommand; offCommands[solt] = offCommand; } //按下开关 public void onButtonWasPressed(int solt) { onCommands[solt].execute(); } //回退 public void offButtonWasPressed(int solt) { onCommands[solt].undo(); } }
```java 测试代码 public class Test { public static void main(String[] args) { //有两个开关的开关控制器 SwitchControl control = new SwitchControl(); //把电灯逻辑绑定到第一个开关上 Light light = new Light("客厅"); control.setCommand(0,new LightOnCommand(light),new LightOffCommand(light)); control.onButtonWasPressed(0); //- 打印:打开客厅的灯 //把电视逻辑绑定到第二个开关上 Television television = new Television(); control.setCommand(1,new TelevisionOnCommand(television),new TelevisionOffCommand(television)); control.onButtonWasPressed(1); //- 打印:打开电视 } }
从上面的代码中可以看到,对于开关控制面板来讲,它只需要按下开关并执行命令的execute方法,不需要知道每个电器的具体实现。
通过使用命令模式对代码的改造,让开关控制器跟具体电器的开/关彻底的解耦。如果想要在控制器上增加新的按钮,可以很方便的增加上去。使得代码更加清晰,易于扩展与维护。
从命令模式的特性中可以看出,如果此时的需求变为按下一个开关需要同时打开灯与电视,那么只需要一个command数组即可。把LightOnCommand和TelevisionOnCommand放入其中,遍历调用execute。
另外,在队列请求中大量的用到了命令模式。一个个的请求依次而来,接收端不需要知道每个请求的具体逻辑,只需要依次调用请求的execute方法即可完成请求的处理。
更多相关内容 -
C#命令模式用法实例
2020-09-03 14:00:09主要介绍了C#命令模式用法,以实例形式较为详细的分析了C#命令模式的功能、定义及使用技巧,需要的朋友可以参考下 -
Java面向接口编程之命令模式实例详解
2020-08-25 14:23:38主要介绍了Java面向接口编程之命令模式,结合实例形式详细分析了Java面向接口编程命令模式的定义、使用方法及相关操作注意事项,需要的朋友可以参考下 -
linux 中的ls命令参数详解及ls命令的使用实例
2021-01-20 16:27:48一、ls命令参数详解 可以通过阅读 ls 的说明书页(man ls)来获得选项的完整列表。 -a – 全部(all)。列举目录中的全部文件,包括隐藏文件(.filename)。位于这个列表的起首处的 .. 和 . 依次是指父目录和... -
Vim中宏命令的使用实例详解
2021-01-11 04:37:08前言 Vim 的设计哲学中有这样一句话:”if you write a thing once, it is okay....宏是一组命令的集合,应用极其广泛,包括MS Office中的word编辑器,excel编辑器和各种文本编辑器,Linux系统中最强 -
JavaScript设计模式之命令模式实例分析
2021-01-19 17:21:39本文实例讲述了JavaScript设计模式之命令模式。分享给大家供大家参考,具体如下: 第一,命令模式: (1)用于消除调用者和接收者之间直接的耦合的模式,并且可以对(调用这个过程进行留痕操作) (2)真的不要乱用这... -
PHP命令Command模式用法实例分析
2021-01-20 08:06:17实际上,命令模式并不是那么神秘。 命令模式的理解,关键有2点: 1. 使用接口。通常命令模式的接口中只有一个方法。 实现类的方法有不同的功能,覆盖接口中的方法。在面向对象编程中,大量使用if…else…,或者... -
命令模式的应用实例
2019-03-26 23:44:21先简单找到一些,不解释很多,做收集用。 1.Spring Colud Hystrix — 服务降级,直接上图: 2.先简单找到一些,不解释很多,做收集用。
1.Spring Colud Hystrix — 服务降级,直接上图:
2.
-
实例讲解设计模式中的命令模式在iOS App开发中的运用
2020-09-02 14:48:38主要介绍了设计模式中的命令模式在iOS App开发中的运用,文中还讲到了Cocoa框架下使用的例子,实例代码为传统的Objective-C,需要的朋友可以参考下 -
JavaScript命令模式原理与用法实例详解
2020-11-20 20:35:13本文实例讲述了JavaScript命令模式原理与用法。分享给大家供大家参考,具体如下: 第一,命令模式: (1)用于消除调用者和接收者之间直接的耦合的模式,并且可以对(调用这个过程进行留痕操作) (2)真的不要乱用这... -
Linux nohup命令原理及实例解析
2021-01-09 04:06:10nohup命令可以将程序以忽略挂起信号的方式运行起来,被运行的程序的输出信息将不会显示到终端。 无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out ... -
【设计模式】命令模式实例与代码分析
2022-05-17 08:54:10一、命令(Commend)模式是什么? 二、命令(Commend)模式的优缺点 三、命令(Commend)模式的结构 四、实例演示 1.实例概述 2.代码演示 3.实验结果 总结 系列文章目录 外观模式实例...目录
系列文章目录
外观模式实例
https://blog.csdn.net/weixin_51167671/article/details/124280001?spm=1001.2014.3001.5501
装饰模式实例
https://blog.csdn.net/weixin_51167671/article/details/124280137?spm=1001.2014.3001.5501
适配器模式实例
https://blog.csdn.net/weixin_51167671/article/details/124136609?spm=1001.2014.3001.5501
前言
设计模式,又称为软件设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。学习设计模式可以提高程序员的思维能力、编程能力和设计能力,使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。
一、🌍命令(Commend)模式是什么?🌍
定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这个方便将命令对象进行储存、传递、调用、增加与管理。
二、🌍命令(Commend)模式的优缺点🌍
优点:
1)降低系统的耦合度。命令模式能将调用操作的对象与实现该操作的对象解耦;
2)增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其它类,它满足“开闭原则”,对扩展比较灵活;
3)可以实现宏命令。命令模式可以与组合模式结合,将多个命令装配成一个组合命令,即宏命令;
4)方便实现Undo和Redo操作。命令模式可以与后面章节介绍的备忘录模式结合,实现命令的撤消与恢复。
缺点:
可能产生大量具体命令类。因为针对每一个具体操作都需要设计一个具体命令类,这将增加系统的复杂性。
三、🌍命令(Commend)模式的结构🌍
命令模式包含以下主要角色:
⑴ 抽象命令类(Command)角色:声明执行命令的接口,拥有执行命令的抽象方法execute()。
⑵ 具体命令角色(ConcreteCommand)角色:是抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作。
⑶ 实现者/接收者(Receiver)角色:执行命令功能的相关操作,是具体命令对象业务的真正实现者。
⑷ 调用者/请求者(Invoker)角色:是请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者。
四、🌍实例演示🌍
1.🌕实例概述🌕
1)抽象命令角色:order类,依赖于接受者类。类中定义了一个接受者角色,用于调用接受者中的方法。
2)具体命令角色:juiceorder、BBQorder、seafoodorder三个类,实现父类定义的抽象方法,在抽象方法中实际调用的是接受者类中的方法。
3)实现者/接收者角色:meituan类,故名是以是美团这个平台。模拟美团作为系统去调用分配外卖员去配送外卖单。
4)调用者/请求者角色:Deliveryman外卖员类。定义了若干实现方法,被具体角色类调用。
2.🌕代码演示🌕
package command; import java.util.ArrayList; //外卖系统 public class commandDemo{ public static void main(String[] args) { // TODO Auto-generated method stub // 定义了一个平台美团 meituan platform = new meituan(); // 定义了一个外卖员 Deliveryman deliveryman = new Deliveryman(); // 然后开始点外卖,先点了一个烧烤外卖 order order = new BBQorder(deliveryman); // 平台收到了订单 platform.addorder(order); // 又点了一个饮料外卖 order = new seafoodorder(deliveryman); // 平台添加订单 platform.addorder(order); // 平台开始派送 platform.delivery(); } } //接收者,外卖骑手 class Deliveryman { public void juiceorder() { System.out.println("正在派送果汁..."); } public void BBQorder() { System.out.println("正在派送烧烤..."); } public void seafoodorder() { System.out.println("正在派送海鲜..."); } } //调用者,美团或者饿了么 class meituan { private ArrayList<order> orderlist = new ArrayList<order>(); // private Breakfast changFen,hunTun,heFen; public void addorder(order c) { if (c != null) orderlist.add(c); } public void delivery() { for (order s : orderlist) { s.execute(); } System.out.println("派送完成~"); } } //抽象命令 abstract class order { protected Deliveryman deliveryman; public order(Deliveryman deliveryman) { this.deliveryman = deliveryman; } public abstract void execute(); } //具体命令 //饮料订单 class juiceorder extends order { public juiceorder(Deliveryman deliveryman) { super(deliveryman); // TODO Auto-generated constructor stub } @Override public void execute() { // TODO Auto-generated method stub deliveryman.juiceorder(); } } //烧烤订单 class BBQorder extends order { public BBQorder(Deliveryman deliveryman) { super(deliveryman); // TODO Auto-generated constructor stub } @Override public void execute() { // TODO Auto-generated method stub deliveryman.BBQorder(); } } //海鲜订单 class seafoodorder extends order { public seafoodorder(Deliveryman deliveryman) { super(deliveryman); // TODO Auto-generated constructor stub } @Override public void execute() { // TODO Auto-generated method stub deliveryman.seafoodorder(); } }
3.🌕实验结果🌕正在派送烧烤...
正在派送海鲜...
派送完成~总结
以上就是今天要讲的内容,本文仅仅简单介绍了行为模式下命令模式的定义,优缺点以及其的模式结构,并通过实例演示,进一步反应了在一定需求条件下,命令模式的优点。
-
Python设计模式之命令模式原理与用法实例分析
2020-09-19 17:52:22主要介绍了Python设计模式之命令模式,结合具体实例形式分析了Python命令模式相关概念、原理、定义及使用方法,需要的朋友可以参考下 -
Linux中ip命令的使用实例
2021-05-10 06:05:04导读在以前的Linux系统版本中,我们一直使用' ifconfig '命令查看ip地址等信息。但是“ifconfig”已经不再被维护,并在近几年的Linux版本中已经被弃用。ifconfig命令已被ip命令替换。ip命令有点类似于ifconfig命令,...导读
在以前的Linux系统版本中,我们一直使用' ifconfig '命令查看ip地址等信息。但是“ifconfig”已经不再被维护,并在近几年的Linux版本中已经被弃用。
ifconfig命令已被ip命令替换。ip命令有点类似于ifconfig命令,但它更强大,附加了更多的功能。ip命令可以执行一些网络相关的任务,是ifconfig不能操作的。
查看网络接口信息
要查看网络接口信息,例如IP地址,子网等,请使用“ ip addr show”命令:
bob@ubuntu-20-04:~$ ip addr show
这会显示系统上所有网络接口的信息,但是如果我们要查看单个网卡信息,以下我们要查看ens33接口的ip信息,可以使用以下命令:
bob@ubuntu-20-04:~$ ip addr show ens33
启用或者禁用网络接口
我们可以使用ip命令启用或禁用网络接口,示例如下所示:
bob@ubuntu-20-04:~$ sudo ip link set ens33 down
可以看到ens33接口的状态变成DOWN了。
我们再启用该网络接口:
bob@ubuntu-20-04:~$ sudo ip link set ens33 up
为接口设置临时的IP地址
要分配IP地址以使用ip命令进行接口,我们将使用以下方法:
bob@ubuntu-20-04:~$ sudo ip addr add 192.168.43.175/255.255.255.0 dev ens33
可以看到ens33接口添加了一个新的ip地址。
从网络接口中删除ip地址
如果要从接口中删除分配的IP,可以使用下面方法:
bob@ubuntu-20-04:~$ sudo ip addr del 192.168.43.175/24 dev ens33
查看路由和默认网关信息
查看路由信息会向我们显示数据包到达目的地所要经过的路由。要检查网络路由信息,请执行以下ip命令:
bob@ubuntu-20-04:~$ ip route show
default via 192.168.43.2 dev ens33 proto dhcp metric 100
169.254.0.0/16 dev ens33 scope link metric 1000
192.168.43.0/24 dev ens33 proto kernel scope link src 192.168.43.174 metric 100
在上面的输出中,我们将看到所有网络接口的路由信息。我们还可以使用以下方式获取到特定ip的路由信息:
bob@ubuntu-20-04:~$ ip route get to 192.168.43.2
查看arp条目
ARP是“地址解析协议”的缩写,用于将IP地址转换为MAC地址,并且所有IP及其对应的MAC详细信息都存储在称为ARP缓存的表中。要查看ARP缓存中的条目可以使用以下命令:
bob@ubuntu-20-04:~$ ip neigh
查看网络统计
使用ip命令,我们还可以查看所有网络接口的网络统计信息,例如传输的字节和数据包,错误或丢失的数据包等。要查看网络统计信息,可以使用ip -s link命令:
bob@ubuntu-20-04:~$ ip -s link
总结
如果要查找上述示例中未列出的选项,可以使用man ip查看详细的帮助。
-
设计模式深入浅出--21.命令模式简单实例及其在JDK中的应用
2019-06-30 14:42:44命令模式解决了应用程序中对象的职责以及它们之间的通信方式 类型:行为型 适用场景: 请求调用者和请求接收者需要解耦,使得调用者和接收者不直接交互 需要抽象出等待执行的行为 优点: 降低解耦 容易扩展新... -
C#调用CMD命令实例
2021-01-20 06:46:59有时候有一些DOS命令需要我们在执行程序的时候调用,这需要使用C#提供的相关接口。 代码如下,很简单,相信大家都能看懂,我就不赘述了。 using System; using System.Collections.Generic; using System.Linq; ... -
详解基于Linux下正则表达式(基本正则和扩展正则命令使用实例)
2020-12-13 07:42:48前言 正则表达式应用广泛,在绝大多数的编程语言都...正则表达式可以使用正则表达式引擎实现,正则表达式引擎是解释正则表达式模式并使用这些模式匹配文本的基础软件。 在Linux中,常用的正则表达式有: – POSIX -
设计模型之命令模式含UML完整实例)
2020-04-16 10:49:39设计模型之命令模式 1. 命令模式 1.1 定义与特点 命令(Command)模式的定义如下:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象... -
Linux 中的 Openssl命令及实例代码
2021-01-20 16:23:10openssl命令的格式是”openssl command command-options args”,command部分有很多种命令,这些命令需要依赖于openssl命令才能执行,所以称为伪命令(pseudo-command),每个伪命令都有各自的功能,大部分command都... -
Linux下使用killall命令终止进程的8大用法实例详解
2021-01-20 15:26:50pkill 命令使用一个正则表达式作为输入,所以和该模式匹配的进程都被杀死。 但是还有一个命令叫 killall ,默认情况下,它精确地匹配参数名,然后杀死匹配进程。在这篇文章中,我们将讨论有关这个命令的实际应用。 ... -
命令模式实例与解析--实例一:电视机遥控器
2021-06-09 18:10:19电视机是请求的接收者,遥控器是请求的发送者,遥控器上有一些按钮,不同的按钮对应电视机的不同操作。抽象命令角色由一个命令接口来扮演,有三个...显然,电视机遥控器就是一个典型的命令模式应用实例。 ... -
Java基于命令模式实现邮局发信功能详解
2020-08-27 15:53:48主要介绍了Java基于命令模式实现邮局发信功能,较为详细的分析了命令行模式的概念、原理并结合实例形式分析了Java使用命令行模式实现邮局发信功能的相关操作技巧与注意事项,需要的朋友可以参考下 -
Linux基础之xargs命令的入门实例
2020-09-15 05:56:20你是否遇到过这样的情况,需要一遍又一遍地对多个文件执行同样的操作?...还好有种简单的方式,可以使用xargs命令解决这个烦恼。本文介绍了Linux基础学习之xargs命令入门的相关资料,需要的朋友可以参考下。 -
Linux下grep命令使用实例
2021-05-18 16:59:37接下来是小编为大家收集的Linux下grep命令使用实例,欢迎大家阅读:Linux下grep命令使用实例grep命令参数grep ‘word’ 文件名grep ‘word’ 文件1 文件2 文件3 …文件Ngrep ‘字符串1 字符串2’ 文件名cat 文件名| ... -
Kubernetes 常用命令及应用实例
2017-12-17 13:54:49Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。 Kubernetes一个... -
设计模式(二):命令模式实例
2019-06-06 22:00:00* 设计模式(二):命令模式实例 * 背景:在一个类中,对一个数据的处理方法不一样,可以使用这种方式 * * @author 修。 * @version 1.0.0 */ package day66; /** * 命令接口:提供统一规范 */ interface ... -
Python单例模式的四种创建方式实例解析
2020-12-20 15:03:42如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很... -
Openstack用命令创建实例
2021-02-26 15:46:537. 命令创建实例 1. 获取项目列表 . admin-openrc openstack project list 2. 获取实例类型列表 openstack flavor list 3. 获取镜像列表 openstack image list 4. 获取网络列表 openstack network list -
命令执行漏洞挖掘实例
2019-08-22 14:10:42这两天给公司的产品做安全测试,有个比较经典的命令执行漏洞感觉还挺有意思,写出来记录一下 一: 前期判断 看到这里有个网络检测,感觉就有命令执行 的漏洞,抓包就试试看 输入127.0.0.1本地地址,发现能ping通 ...