Java设计模式之命令模式
命令模式的概念其实还挺模糊的,虽然不难,但是直接看起来也有点晕,直接看代码过一遍再去了解概念会好一些。
其实简单的说命令模式就是将一个"请求"封装成一个对象,通过这个对象直接就能找到对应的执行命令。
优点:
好处是对于需要重复修改或实现的一些固定的操作,可以很方便的去执行,而不用抽丝剥茧的每次都和细分后的环节打交道,只需要和一个接受者打交道就行了。比如客户经常需要频繁的改需求,如果让客户每次都和美工组或者程序猿直接沟通,偶尔还好,要是次数多了就会显得很麻烦,而如果客户直接把他的想法告诉一个固定的人,这个人接收到客户的想法后直接就可以调用相应的对象去执行。
缺点:
如果客户要不断实现的需求有很多种类,那就得不断的增加相应的功能实现,就会弄得很麻烦。
先看一张UML图,了解下每一层的关系



虽然流程图是从上往下看的,但是实现过程我们得根据现实来,先从底层开始一点点实现
干活前得先把人凑齐了,所以先组建一个项目组
packagecom.company;//项目组
public abstract classGroup {//规定项目组具备的功能,增删改查四个功能
abstract voidfind();abstract voidadd();abstract voiddelet();abstract voidchange();
}
人凑齐了需要进行分工和准备工具,这里分成了需求、美工、和代码三个组,每个组都实现了项目组里的功能
代码组
packagecom.company;public class Code extendsGroup {
@Overridevoidfind() {
System.out.println("查到代码组");
}
@Overridevoidadd() {
System.out.println("实现一个代码功能");
}
@Overridevoiddelet() {
System.out.println("删除一个代码功能");
}
@Overridevoidchange() {
System.out.println("修改一个代码功能");
}
}
需求组
packagecom.company;public class Require extendsGroup {
@Overridevoidfind() {
System.out.println("查找到需求组");
}
@Overridevoidadd() {
System.out.println("增加一个需求");
}
@Overridevoiddelet() {
System.out.println("删除一个需求");
}
@Overridevoidchange() {
System.out.println("修改一个需求");
}
}
美工组
packagecom.company;public class Ui extendsGroup {
@Overridevoidfind() {
System.out.println("查找到美工组");
}
@Overridevoidadd() {
System.out.println("增加一个美工页面");
}
@Overridevoiddelet() {
System.out.println("删除一个美工页面");
}
@Overridevoidchange() {
System.out.println("修改一个美工页面");
}
}
人和工具都有了,现在需要从项目组里选出一个人来和客户进行对接,客户有什么想法直接告诉这个人就行了,这样就不需要去和代码组或者美工这些人沟通了
packagecom.company;/*该类是项目组中出的一个项目负责人也就是接收人,
当这个接收人接到了客户的命令的时候,根据这个命令执行相应的动作*/
public classGroupMan {
Conmand conmand;//得到客户命令
public voidgetConmand(Conmand conmand){this.conmand =conmand;
}//执行方法
public voidaction(){
conmand.execute();
}
}
客户可以直接把功能命令告诉这个接收人,那么现在需要一个功能命令
packagecom.company;public abstract classConmand {//命令中的执行方法,执行的具体实现由项目组中的分组分别去实现
abstract voidexecute();
}
功能命令需要具体的功能去实现它,比如说增加一个代码功能或者删除一个美工图片
这里先实现一个:"增加代码功能"的功能命令
packagecom.company;public class AddCode extendsConmand {
Code code= newCode();//该功能由代码组的人员去实现
@Overridevoidexecute() {
code.find();
code.add();
}
}
其实从这里就可以看出这个命令模式的缺点了,如果客户后面要增加的功能命令有好多,那么这里就需要实现很多具体的功能,这样就很繁琐了
下面就是整个项目动起来的效果了
packagecom.company;importjava.util.HashMap;importjava.util.Iterator;importjava.util.Map;importjava.util.Set;public classMain {public static voidmain(String[] args) {
System.out.println("客户给出一个命令:我需要增加一个代码功能");//产生命令
Conmand conmand = newAddCode();//叫来项目对接人
GroupMan groupMan = newGroupMan();//告诉项目对接人命令
groupMan.getConmand(conmand);//项目对接人知道命令后去落实这个命令了:在这背后是这个对接人通知了Group组中的Code组去实现了这个功能
groupMan.action();
}
}

本文通过实例详细介绍了Java设计模式中的命令模式,展示了如何将请求封装为对象,简化客户端与具体执行者之间的交互。文章通过创建项目组、分工及功能实现,演示了命令模式的工作流程,并指出了其在需求频繁变动时的优缺点。最后,通过代码展示了命令模式的运行效果。
703

被折叠的 条评论
为什么被折叠?



