23种设计模式之_命令行模式
原创
©著作权归作者所有:来自51CTO博客作者灯塔kuaidao的原创作品,请联系作者获取转载授权,否则将追究法律责任
前言
设计模式也已经总结了十多种,总的来说的还是对java的三大特性进行反复使用,形成的固定写法,越往后面学习,越觉得23种设计模式就是对java三大特性总结的缩小版。仅个人愚见
定义:命令行模式并非一行行命令的执行,而是写法上类似对一个具体逻辑的封装。(内部进行封装具体的实现)
Uml类图
衍生出来命令行模式写法
源码分析
由于实在是简单,看着类图就可以联想出来具体的实现方式,这里不进行贴代码,只是把命令行模式贴出来(还是贴…….)
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 功能
变更报告清单
命令行通用类图
总结:在这个类图中,我们看到三个角色:
Receiver 角色:这个就是干活的角色,命令传递到这里是应该被执行的,具体到上面我们的例子中就是
Group 的三个实现类;
Command 角色:就是命令,需要我执行的所有命令都这里声明;
Invoker 角色:调用者,接收到命令,并执行命令,例子中我这里项目经理就是这个角色;
命令模式比较简单,但是在项目中使用是非常频繁的,封装性非常好,因为它把请求方( Invoker)和执
行方( Receiver)分开了,扩展性也有很好的保障。但是,命令模式也是有缺点的,你看 Command 的子类没
demo 下载: http://pan.baidu.com/s/1miDLdG0
引用:23种设计模式 作者 cbf4Life