设计模式之命令模式(Command)

命令模式,个人理解:将具体的类的A方法抽象提升到父类层次,这样在调用时,就可以直接依据当前类来选择相关方法并执行,有点像C++中的虚函数。简写的伪代码:

父类 F 中的方法eat(). 子类A,B各自实现自己的eat方法,比如A.eat(){吃梨子},B.eat(){吃米饭}

测试主程序:

F a = new A();

F b = new B();

a.eat();  //显示吃梨子

b.eat(); //显示吃米饭

但是我们可以看出来a,b都是F类型,这个就可以在调用时方便数据的传送了。

假如现在有一个函数eatSomething(F f),我们调用的时候就可以这样来写:eatSomething(a),eatSomething(b). 好处不言而喻,注意细细体会。

其实命令模式的精髓也是如此。把命令抽象,让不同的命令都可以使用相同的接口去执行。在调用者跟执行者之间可以解耦。我这里模仿的案例是:老板与员工的关系,老板发布工作命令,员工执行,老板发布休息命令,员工执行。先看具体的代码:

public interface Command {
	public void execute();
}
public class WorkCommand implements Command {
	public Worker worker;

	public WorkCommand(Worker w) {
		worker = w;
	}

	@Override
	public void execute() {
		worker.work();
	}
}
public class RestCommand implements Command {
	Worker worker;

	public RestCommand(Worker w) {
		worker = w;
	}

	@Override
	public void execute() {
		worker.rest();
	}

}
public class Boss {
	private Command command;

	public void setCommand(Command c) {
		command = c;
	}

	public void executeCommand() {
		command.execute();
	}
}
public class Worker {

	public void work() {
		System.out.println("Workers are Working");

	}

	public void rest() {
		System.out.println("Workers are Resting");

	}

}
public class Main {
	public static void main(String[] args) {
		Boss boss = new Boss();
		Worker w = new Worker();
		// 工作Command
		Command c1 = new WorkCommand(w);

		boss.setCommand(c1);
		boss.executeCommand();

		System.out.println("===============分割线===============");
		// 休息Command
		Command c2 = new RestCommand(w);

		boss.setCommand(c2);
		boss.executeCommand();
	}
}


运行结果:

Workers are Working
===============分割线===============
Workers are Resting


这里的命令虽然有work和rest这两套命令,但是对boss来说都是Command,他只要setCommand(),然后就可以执行了。所以Boss并不用考虑具体的Command类型,他只管发布命令就行了。这就是Command类型向上提升的好处。

总结一下:

1)需要Command的interface或者抽象类的类型提升

2)Command的execute方法的具体实现是决定当前命令由谁来具体执行,不用老板来考虑哪个工人来工作,老板只要发布命令就好了。

3)注意函数的参数类型都是提升的类型如Boss.setCommand(Command c),好处就是Boss可以不用考虑具体的命令是什么~

项目源码链接:http://www.kuaipan.cn/file/id_132802506211221453.htm?source=1

原文地址:https://www.cnblogs.com/vokie/p/3602073.html