设计模式之命令模式(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