命令模式 java_Java命令模式

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

Java设计模式之命令模式

命令模式的概念其实还挺模糊的,虽然不难,但是直接看起来也有点晕,直接看代码过一遍再去了解概念会好一些。

其实简单的说命令模式就是将一个"请求"封装成一个对象,通过这个对象直接就能找到对应的执行命令。

优点:

好处是对于需要重复修改或实现的一些固定的操作,可以很方便的去执行,而不用抽丝剥茧的每次都和细分后的环节打交道,只需要和一个接受者打交道就行了。比如客户经常需要频繁的改需求,如果让客户每次都和美工组或者程序猿直接沟通,偶尔还好,要是次数多了就会显得很麻烦,而如果客户直接把他的想法告诉一个固定的人,这个人接收到客户的想法后直接就可以调用相应的对象去执行。

缺点:

如果客户要不断实现的需求有很多种类,那就得不断的增加相应的功能实现,就会弄得很麻烦。

先看一张UML图,了解下每一层的关系

cd0199380bf20e584fc55efd8c1f774e.png

77f6862c79d7a37324bc95b15e6229a0.png

0cc36098757fd6e9eec3946d6f1a651f.png

虽然流程图是从上往下看的,但是实现过程我们得根据现实来,先从底层开始一点点实现

干活前得先把人凑齐了,所以先组建一个项目组

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();

}

}

cb770af06d9cf27b6940c139452a0c40.png

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值