Java设计模式--命令模式

命令模式【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)如果命令很多,开发起来就要头疼了。特别是很多简单的命令,实现起来就几行代码的事,而使用命令模式的话,不用管命令多简单,都需要写一个命令类来封装。使代码出现臃肿现象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值