命令模式是一种对象行为型模式,意在将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
我们经常会使用windows的CMD命令控制台进行进行一系列的操作,比如我们要测试网络通不通我们会用PING命令,查看本地IP地址我们会输入IPCONFIG命令命令,那么是不是我们输入这些命令本身就代表操作windows进行一些操作呢?很明显这些命令只是控制windows系统做一系列的操作而不是命令本身,这种将请求封装成一个对象来操作命令接收者做一系列的动作的模式我们就可以理解成命令模式。
命令模式适用于操作请求能够被当作是命令的情况下。
命令模式适用于系统需要支持回退或者撤销某操作的情况下。
命令模式总共涉及4个角色:
抽象命令角色(Command):声明执行操作的接口。
具体命令角色(ConcreteCommand):将一个接收者对象绑定于一个动作,调用接收者相应的操作以实现Execute。
请求者角色(Invoker):负责调用相关的命令体执行请求。
接收者角色(Receiver):负责具体实施和执行某一个请求。
1、首先定义一个抽象命令角色,并且声明执行操作的接口
public interface Command { void Execute(); }
2、定义接收者角色执行定义实际执行操作的过程
public class Receiver { public void PingAction() { System.out.println("执行ping操作"); } public void IpConfigAction() { System.out.println("执行ipconfig操作"); } }
3、分别定义执行PING和IPCONFIG命令的具体命令角色
public class Ping implements Command { private Receiver receiver; public Ping(Receiver receiver) { this.receiver = receiver; } @Override public void Execute() { this.receiver.PingAction(); } }
public class IpConfig implements Command { private Receiver receiver; public IpConfig(Receiver receiver) { this.receiver = receiver; } @Override public void Execute() { this.receiver.IpConfigAction(); } }
4、定义发出请求者角色,接收客户端的命令并且执行命令
public class Invoker { private Command command; public void setCommand(Command command) { this.command = command; } public void executeCommand() { this.command.Execute(); } }
4、客户端调用
public class Client { public static void main(String[] args) { Receiver receiver = new Receiver(); Command command1 = new Ping(receiver); Command command2 = new IpConfig(receiver); Invoker invoker1 = new Invoker(); invoker1.setCommand(command1); invoker1.executeCommand(); Invoker invoker2 = new Invoker(); invoker2.setCommand(command2); invoker2.executeCommand(); } } /* 运行结果: 执行ping操作 执行ipconfig操作*/
关于设计模式的命令模式基础的实现就差不多跟上面的示例一样了,其实就是将发出命令的对象和实际执行命令的过程解耦开来,通过一个中间角色命令角色来控制具体实现的操作。
命令模式将命令的请求者和命令的处理者分开来,命令的请求者也不清楚请求的命令由哪个对象来执行,也不知道具体实现的操作是怎么样的。
命令模式可以将命令组合起来形成一个复杂的宏命令,这样可以通过一个命令来实现一系列化的操作。
由于命令的发起者和命令的处理者完全解耦,所以命令模式有很好的扩展性,要扩展新的命令只需要添加新的命令类然后再客户端调用的时候动态的将其装载进去就可以了。
由于命令模式针对每一个命令都会新建一个类去包装形成一个对象,这样在系统的逐步扩大的过程中会形成许多的命令类使得系统更加复杂并且增加内存的消耗。
原文:https://www.cnblogs.com/rhodesis/p/11279539.html