一:什么是命令模式?
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。
请求以命令的形式包裹在对象中,并传给调用对象。
调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
二:进一步了解命令模式
目的:
将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
主要解决:
行为请求者与行为实现者通常是一种紧耦合的关系。
但比如需要对行为进行记录、撤销或重做、事务等处理时
何时使用:
在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。
如何解决:
通过调用者调用接受者执行命令,顺序:调用者→命令→接受者。
优点:
1、降低了系统耦合度。
2、新的命令可以很容易添加到系统中去。
缺点:
使用命令模式可能会导致某些系统有过多的具体命令类。
注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。
三:实现(CMD命令Demo)
一个电脑接口,一个CMD功能类,两个电脑接口实现类(组合了CMD对象,使用CMD对象调用CMD功能),一个命令调用类(存对象,执行对象中的方法)。
电脑接口
//电脑接口
public interface Computer {
//电脑的执行方法
void execute();
}
CMD命令类
//CMD命令类
public class CMD {
public void mspaint(){
System.out.println("调用了画板功能");
}
public void notepad(){
System.out.println("调用了记事本");
}
}
CMD命令具体执行类
//CMD命令具体执行类
public class Mspaint implements Computer {
private CMD cmd;
public Mspaint(CMD cmd) {
this.cmd = cmd;
}
@Override
public void execute() {
cmd.mspaint();
}
}
CMD命令具体执行类
//CMD命令具体执行类
public class Notepad implements Computer {
private CMD cmd;
public Notepad(CMD cmd) {
this.cmd = cmd;
}
@Override
public void execute() {
cmd.notepad();
}
}
命令调用类
import java.util.ArrayList;
import java.util.List;
//命令调用类
public class CommandCall {
private List<Computer> orders = new ArrayList<>();
//存命令
public void takeOrders(Computer order){
orders.add(order);
}
//执行命令
public void executeOrders(){
for (Computer order:orders) {
order.execute();
}
}
}
测试
//测试
public class Test {
public static void main(String[] args) {
CMD cmd = new CMD();
Mspaint mspaint = new Mspaint(cmd);
Notepad notepad = new Notepad(cmd);
CommandCall commandCall = new CommandCall();
commandCall.takeOrders(mspaint);
commandCall.takeOrders(notepad);
commandCall.executeOrders();
}
}
执行结果: