概述:模式比较简单,一个发起命令,一个执行命令。

核心思想: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模式的设计思想,明白原理,灵活运用即可。设计模式的最高境界,自己不知道自己已经运用了设计模式。

欢迎吐槽指正,让我们一起变得强大!

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐