命令模式
命令模式属于行为模式。如你的上级领导指派给你的A,B,C三项任务。让你做A,你就做A,让你做B就做B。指哪打哪。
外部的人对于你和你的领导来说,知道你的领导派发了ABC任务给你,你也完成ABC任务,任务具体是怎么完成的外部的人并不需要关心。
使用场景
- 某一对象有一系列的事物操作
- 具有抽象行为的动作,支持多种类型的操作
代码示例
大学的新生入学都会进行军训,军训的项目有正步,齐步,军姿等等… 而这一系列的内容都是由教官下发命令,所有的同学进行执行。
- 常规实现方式
只需要封装一个具体的军训类管理即可,直接调用即可
public class MilitaryTraining {
public void march() {
System.out.print("军训齐步");
}
public void goose() {
System.out.print("军训正步");
}
}
- 命令模式
(一)命令接口做什么
public interface Command {
void doSomothing();//具体做什么
}
(二)具体的命令
齐步命令:
public class MarchCommand implements Command {
private MilitaryTraining militaryTraining;
public MarchCommand(MilitaryTraining militaryTraining1) {
this.militaryTraining = militaryTraining1;
}
@Override
public void doSomothing() {
if (militaryTraining!=null){
militaryTraining.march();
}
}
}
正步命令:
public class GooseCommand implements Command {
private MilitaryTraining militaryTraining;
public GooseCommand(MilitaryTraining militaryTraining1) {
this.militaryTraining = militaryTraining1;
}
@Override
public void doSomothing() {
if (militaryTraining != null) {
militaryTraining.goose();
}
}
}
(三)命令控制的管理器
public class CommandController {
private GooseCommand gooseCommand;
private MarchCommand marchCommand;
public void setGooseCommand(GooseCommand gooseCommand) {
this.gooseCommand = gooseCommand;
}
public void setMarchCommand(MarchCommand marchCommand) {
this.marchCommand = marchCommand;
}
public void marchCommadn(){
if(marchCommand!=null){
marchCommand.doSomothing();
}
}
public void gooseCommand(){
if(gooseCommand!=null){
gooseCommand.doSomothing();
}
}
}
(四)调用方式
- 常规方式
MilitaryTraining militaryTraining=new MilitaryTraining();
militaryTraining.goose();//正步
militaryTraining.march();//齐步
- 命令模式
//采用命令模式调用
/**
* 优点:命令模式耦合度更低,扩展性更强,维护方便,
* 可对命令进行组合使用
* 对新的命令扩展更容易
*
* 缺点:命令类很多,对基础技术要求较高,否则难于阅读代码。
*/
MilitaryTraining militaryTraining1 = new MilitaryTraining();
GooseCommand gooseCommand = new GooseCommand(militaryTraining1);
MarchCommand marchCommand = new MarchCommand(militaryTraining1);
CommandController commandController = new CommandController();
commandController.setGooseCommand(gooseCommand);
commandController.setMarchCommand(marchCommand);
commandController.gooseCommand();
commandController.marchCommadn();
(五)显示结果
军训正步
军训齐步
军训正步
军训齐步
总结
优点:
- 耦合度低,命令可控,可组合同时完成或者顺序完成
缺点:
- 类太多,简单的行为命令反而复杂
明显看出上面的调用方式,传统方式2行代码就可以解决的问题,使用命令模式却多了很多类和代码,还不如不用设计模式清晰简单,为什么会这样呢?
因为上述的命令以及行为操作很简单,因此对于简单的行为操作命令,个人建议按照传统方式使用书写就好,过度使用设计模式反而令人不易理解,类的增加也极其迅速。
但是命令模式的好处是对于复杂的行为命令,可以更好的降低耦合度,将命令发起方与执行方隔离,只需要发起命令,由谁完成,怎么样完成都不需要知道。