Java设计模式--命令模式
来源:互联网 发布:网络优化工程师qq群 编辑:程序博客网 时间:2024/05/16 19:50
命令模式【Command Pattern 】
以公司做项目为例,一个项目的完成需要不同的项目组进行合作,先假设客户与每个项目组进行讨论,最后执行任务。这个项目主要是进行增删改查。
先看类图:
Group类设计如下:
public abstract class Group { //甲乙双方分开办公,你要和那个组讨论,你首先要找到这个组 public abstract void find(); //被要求增加功能 public abstract void add(); //被要求删除功能 public abstract void delete(); //被要求修改功能 public abstract void change(); //被要求给出所有的变更计划 public abstract void plan();}
需求组定义如下:
public class RequirementGroup extends Group { //客户要求需求组过去和他们谈 public void find() { System.out.println("找到需求组..."); } //客户要求增加一项需求 public void add() { System.out.println("客户要求增加一项需求..."); } //客户要求修改一项需求 public void change() { System.out.println("客户要求修改一项需求..."); } //客户要求删除一项需求 public void delete() { System.out.println("客户要求删除一项需求..."); } //客户要求出变更计划 public void plan() { System.out.println("客户要求需求变更计划..."); }}
依次类推,这样子设计的话,客户就要跟不同的项目组分别讨论,显然是不太合理的,谁这么有空??于是乎就要有项目经理这个角色来充当项目的对接,使客户只需与项目经理进行沟通即可。
类图修改如下:
Command 抽象类:客户发给我们的命令,定义三个工作组的成员变量,供子类使用;定义一个抽象方法
execute,由子类来实现;
Invoker 实现类:项目接头人,setComand 接受客户发的命令,action 方法是执行客户的命令(方法名写成是 action 是与 command 的 execute 区分开,避免混淆)
我们先看 Command 抽象类代码:
public abstract class Command { //把三个组都定义好,子类可以直接使用 protected RequirementGroup rg = new RequirementGroup(); //需求组 protected PageGroup pg = new PageGroup(); //美工组 protected CodeGroup cg = new CodeGroup(); //代码组; //只要一个方法,你要我做什么事情 public abstract void execute();}
增加需求的类可以设计如下:
public class AddRequirementCommand extends Command { //执行增加一项需求的命令 public void execute() { //找到需求组 super.rg.find(); //增加一份需求 super.rg.add(); //给出计划 super.rg.plan(); }}
接头人的任务就是根据用户提什么要求就执行相应的要求。
public class Invoker { //什么命令 private Command command; //客户发出命令 public void setCommand(Command command){ this.command = command; } //执行客户的命令 public void action(){ this.command.execute();}
于是乎,在主类的方法调用只需如下:
public static void main(String[] args) { //定义我们的接头人 Invoker xiaoSan = new Invoker(); //接头人 //客户要求增加一项需求 System.out.println("-------------客户要求增加一项需求-----------------"); //客户给我们下命令来 Command command = new AddRequirementCommand(); //接头人接收到命令 xiaoSan.setCommand(command); //接头人执行命令 xiaoSan.action();}
这样就实现了命令模式。下面还得看一下命令模式的通用类图。
在这个类图中,我们看到三个角色:
Receiver 角色:这个就是干活的角色,命令传递到这里是应该被执行的,具体到上面我们的例子中就是
Group 的三个实现类;
Command 角色:就是命令,需要我执行的所有命令都这里声明;
Invoker 角色:调用者,接收到命令,并执行命令,例子中我这里项目经理就是这个角色
总结:
(1)命令模式体现出来封装性,把请求方(Invoker)和执行方(Receiver)分开了,同时也保障了很好的扩展性。
(2)如果使用命令模式,就要引入调用者、接收者两个角色,原本放在一处的逻辑就会分散到了三个类中,设计时,必须考虑这样的代价是否值得。
(3)如果命令很多,开发起来就要头疼了。特别是很多简单的命令,实现起来就几行代码的事,而使用命令模式的话,不用管命令多简单,都需要写一个命令类来封装。使代码出现臃肿现象。
- java设计模式-命令模式
- java设计模式---命令模式
- java设计模式---命令模式
- 【java 设计模式】命令模式
- Java设计模式:命令模式
- java设计模式-----命令模式
- Java设计模式-命令模式
- java设计模式---命令模式
- Java设计模式--命令模式
- Java设计模式--命令模式
- JAVA设计模式-命令模式
- java设计模式,命令模式
- JAVA设计模式--命令模式
- Java设计模式-命令模式
- java设计模式-命令模式
- Java设计模式-命令模式
- JAVA设计模式-命令模式
- JAVA 设计模式 命令模式
- java夯实基础系列:装箱、拆箱
- Android OSM无法加载地图
- Kindeditor 使用方法及ThinkPHP图片上传
- JavaScript基础
- Caffe CPU训练模型
- Java设计模式--命令模式
- PID参数调节总结
- 实例学习ansible系列(7)常用模块之ping/setup
- C语言以epoll方式实现的简单socket实例
- "guard"相比"if...else"可读性更强
- 白练4118开餐馆
- 【javase复习】## day 4 继承的内存分析、super、final ##
- Android ORM之greenDao
- JVM附录图