前言
设计模式也已经总结了十多种,总的来说的还是对java的三大特性进行反复使用,形成的固定写法,越往后面学习,越觉得23种设计模式就是对java三大特性总结的缩小版。仅个人愚见

定义:命令行模式并非一行行命令的执行,而是写法上类似对一个具体逻辑的封装。(内部进行封装具体的实现)

Uml类图

23种设计模式之_命令行模式_设计模式

衍生出来命令行模式写法

23种设计模式之_命令行模式_类图_02

源码分析

由于实在是简单,看着类图就可以联想出来具体的实现方式,这里不进行贴代码,只是把命令行模式贴出来(还是贴…….)

Client( 客户端)

package patterncommond;

public class Client {

public static void main(String[] args) {

Commond commond = new DeleCodeCommond();

Invorker invorker = new Invorker();

invorker.setCommond(commond);

invorker.actionCommond();

/* 撤销不做了 */

Commond undoCommond = new UnDoCodeCommond();
invorker.setCommond(undoCommond);
invorker.actionCommond();

}
}

客户端,类似使用程序的客户,想要改需求,则需要通过Invorker(项目经理)发布ActionCommond进行具体实现

Commond(命令)

package patterncommond;

public abstract class Commond {

protected Coder coder = new Coder(); // 代码编写
protected MG mg = new MG();// ui切图

/**
* 具体命令的执行模板
*/
abstract void exe();
}

Inverker(项目经理)

package patterncommond;

public class Invorker {

protected Commond commond; // 抽象命令

/**
* 设置命令
*
* @param commond
*/
public void setCommond(Commond commond) {
this.commond = commond;
}

/**
* 执行命令
*/
public void actionCommond() {
commond.exe();
}
}

Inverker类只负责接受命令和分发(actionCommond)命令到下层进行具体实现

DelCodeCommond具体命令

package patterncommond;

public class DeleCodeCommond extends Commond {

@Override
void exe() {
super.coder.find();
super.coder.del();
super.coder.plan();
}

}

具体的一条命令,del 一行代码,Abstract Commond类中存储了具体人员的引用,包括 MG,CODER …,删除代码是Coder做的,那么在具体的命令封装类中调用相应的人员进行操作即可

Coder(代码工,哈哈)

package patterncommond;

public class Coder extends Group {

@Override
void add() {

System.out.println("增加功能");
}

@Override
void find() {
System.out.println("找到 coder");
}

@Override
void del() {

System.out.println("del功能");
}

@Override
void modify() {

System.out.println("modify功能");
}

@Override
void plan() {
System.out.println("变更报告清单");
}

}

Coder就是现实中的编程人员,进行具体的操作

MG(美工)

package patterncommond;

public class MG extends Group {

@Override
void add() {

System.out.println("MG add功能 ");

}

@Override
void find() {
System.out.println("找到 MG 组 ");

}

@Override
void del() {
System.out.println("MG del功能");

}

@Override
void modify() {
System.out.println("MG modify功能");

}

@Override
void plan() {
System.out.println("变更报告清单");
}

}

MG就是现实中的编美工,ui设计,进行具体的操作

unDoCodeCommond

package patterncommond;

public class UnDoCodeCommond extends Commond {

@Override
void exe() {
System.out.println("撤销不做");
}

}

撤销不做了,当然这里只是简单的比较,同样客户也可以下一个需要MG和 Coder配合命令,当然现实中就是协同工作

Eg:更新ui的同时coder也需要更新

@overide
Public void exe(){

super.coder.find();
super.coder.del();
super.coder.plan();
super.mg.find();
super.mg.modify();
super.mg.plan();
}

执行结果

找到 coder
del功能
变更报告清单
找到 MG
Modify 功能
变更报告清单

命令行通用类图

23种设计模式之_命令行模式_设计模式_03

总结:在这个类图中,我们看到三个角色:
Receiver 角色:这个就是干活的角色,命令传递到这里是应该被执行的,具体到上面我们的例子中就是
Group 的三个实现类;
Command 角色:就是命令,需要我执行的所有命令都这里声明;
Invoker 角色:调用者,接收到命令,并执行命令,例子中我这里项目经理就是这个角色;

命令模式比较简单,但是在项目中使用是非常频繁的,封装性非常好,因为它把请求方( Invoker)和执
行方( Receiver)分开了,扩展性也有很好的保障。但是,命令模式也是有缺点的,你看 Command 的子类没

demo 下载: ​​http://pan.baidu.com/s/1miDLdG0​

引用:23种设计模式 作者 cbf4Life