概述:模式比较简单,一个发起命令,一个执行命令。
核心思想:Command接口类定义一个execute()命令执行 和 unDo()命令回撤。
案例一:MM向boy发起一组命令,boy执行命令
设计思路:
1、定义一个Command抽象类,分别定义两个方法:execute()、unDo();
2、给Boy类分别定义执行命令的方法、回滚命令的方法:executeCommands()、unDoCommands();
3、定义一些具体命令类,并继承Command类诸如:ShoppingCommand、HugCommand类等。
4、MM类定义发起命令的方法,入参简单一点,传入一个Boy。
注:实际场景也可灵活传入命令,此案例简单的写。
代码实现:
//1.定义命令类的抽象类
public abstract class Command {
public abstract void execute() ;//执行命令
public abstract void unDo() ; //回滚命令
}
//2.定义命令类的子类
public class HugCommand extends Command {
@Override
public void execute() {
System.out.println("抱一抱");
}
@Override
public void unDo() {
System.out.println("放开双臂");
}
}
//2.定义命令类的子类
public class ShoppingCommand extends Command{
@Override
public void execute() {
System.out.println("一起逛街中");
}
@Override
public void unDo() {
System.out.println("退出逛街");
}
}
//3.给男孩定义执行、撤销命令的方法
public class Boy {
List<Command> commands=new ArrayList<Command>();//存放要执行的命令
List<Command> unDocommands=new ArrayList<Command>();//存放需要撤销的命令
public void addCommand(Command command) {
this.commands.add(command);
}
public void executeCommands() {
for (Command command : commands) {
command.execute();
}
}
public void unDoCommands() {
for (Command command : unDocommands) {
command.unDo();
}
}
}
//4.给MM定义,发起命令的方法
public class MM {
//命令boy做事
public static void order(Boy boy) {
boy.addCommand(new HugCommand());//拥抱的命令
boy.addCommand(new ShoppingCommand());//逛街的命令
boy.executeCommands();
}
public static void main(String[] args) {
order(new Boy());
}
}
运行结果:
抱一抱
一起逛街中
总结:
1、以上案例主要讲述,命令模式的脉络,不涉及细节问题。
2、实际运用中,该模式考虑的要多一些,特别是命令的回滚这块,要记录哪些命令已经执行了,哪些命令还没有执行,如何回滚命令。
3、实际运用中,还要考虑:发起命令方,灵活的发起命令等一些列问题。
以上案例,只为讲述Command模式的设计思想,明白原理,灵活运用即可。设计模式的最高境界,自己不知道自己已经运用了设计模式。
欢迎吐槽指正,让我们一起变得强大!