Java设计模式之命令模式
命令模式的概念其实还挺模糊的,虽然不难,但是直接看起来也有点晕,直接看代码过一遍再去了解概念会好一些。
其实简单的说命令模式就是将一个"请求"封装成一个对象,通过这个对象直接就能找到对应的执行命令。
优点:
好处是对于需要重复修改或实现的一些固定的操作,可以很方便的去执行,而不用抽丝剥茧的每次都和细分后的环节打交道,只需要和一个接受者打交道就行了。比如客户经常需要频繁的改需求,如果让客户每次都和美工组或者程序猿直接沟通,偶尔还好,要是次数多了就会显得很麻烦,而如果客户直接把他的想法告诉一个固定的人,这个人接收到客户的想法后直接就可以调用相应的对象去执行。
缺点:
如果客户要不断实现的需求有很多种类,那就得不断的增加相应的功能实现,就会弄得很麻烦。
先看一张UML图,了解下每一层的关系
虽然流程图是从上往下看的,但是实现过程我们得根据现实来,先从底层开始一点点实现
干活前得先把人凑齐了,所以先组建一个项目组
package com.company; //项目组 public abstract class Group { // 规定项目组具备的功能,增删改查四个功能 abstract void find(); abstract void add(); abstract void delet(); abstract void change(); }
人凑齐了需要进行分工和准备工具,这里分成了需求、美工、和代码三个组,每个组都实现了项目组里的功能
代码组
package com.company; public class Code extends Group { @Override void find() { System.out.println("查到代码组"); } @Override void add() { System.out.println("实现一个代码功能"); } @Override void delet() { System.out.println("删除一个代码功能"); } @Override void change() { System.out.println("修改一个代码功能"); } }
需求组
package com.company; public class Require extends Group { @Override void find() { System.out.println("查找到需求组"); } @Override void add() { System.out.println("增加一个需求"); } @Override void delet() { System.out.println("删除一个需求"); } @Override void change() { System.out.println("修改一个需求"); } }
美工组
package com.company; public class Ui extends Group { @Override void find() { System.out.println("查找到美工组"); } @Override void add() { System.out.println("增加一个美工页面"); } @Override void delet() { System.out.println("删除一个美工页面"); } @Override void change() { System.out.println("修改一个美工页面"); } }
人和工具都有了,现在需要从项目组里选出一个人来和客户进行对接,客户有什么想法直接告诉这个人就行了,这样就不需要去和代码组或者美工这些人沟通了
package com.company; /*该类是项目组中出的一个项目负责人也就是接收人, 当这个接收人接到了客户的命令的时候,根据这个命令执行相应的动作*/ public class GroupMan { Conmand conmand; // 得到客户命令 public void getConmand(Conmand conmand){ this.conmand = conmand; } // 执行方法 public void action(){ conmand.execute(); } }
客户可以直接把功能命令告诉这个接收人,那么现在需要一个功能命令
package com.company; public abstract class Conmand { //命令中的执行方法,执行的具体实现由项目组中的分组分别去实现 abstract void execute(); }
功能命令需要具体的功能去实现它,比如说增加一个代码功能或者删除一个美工图片
这里先实现一个:"增加代码功能"的功能命令
package com.company; public class AddCode extends Conmand { Code code = new Code();//该功能由代码组的人员去实现 @Override void execute() { code.find(); code.add(); } }
其实从这里就可以看出这个命令模式的缺点了,如果客户后面要增加的功能命令有好多,那么这里就需要实现很多具体的功能,这样就很繁琐了
下面就是整个项目动起来的效果了
package com.company; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class Main { public static void main(String[] args) { System.out.println("客户给出一个命令:我需要增加一个代码功能"); //产生命令 Conmand conmand = new AddCode(); // 叫来项目对接人 GroupMan groupMan = new GroupMan(); //告诉项目对接人命令 groupMan.getConmand(conmand); //项目对接人知道命令后去落实这个命令了:在这背后是这个对接人通知了Group组中的Code组去实现了这个功能 groupMan.action(); } }