命令模式
定义:
在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。而命令模式就是将“行为请者”与“行为实现者”解耦的。
类图:
举例(客户提出需求给需求部门、美工部门、开发部门):
描述:
客户(Client)如果提出一个需求(Command),增加语音识别功能。没使用命令模式之前,客户(Client)是这样操作的,先通知需求部门(Receiver1),再通知美工部门(Receiver2),再通知开发部门(Receiver3),这样的话,是十分繁琐的,所以引出了命令模式。
……
命令模式是这样处理的,找出一个代表(invoker),让代表去执行我发出的需求(Command)。这样做的话,可以把客户和所有部门解耦了,让代表去执行命令即可。
上面就描述完了业务了,下面看下代码吧(代码其实不是重点,主要是业务)
Receiver:
/**
*部门抽象
*/
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("客户要求需求变更计划...");
}
}
/**
*美工部门
*/
public class PageGroup extends Group {
......
}
/**
*开发部门
*/
public class CodeGroup extends Group {
......
}
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.pg.add();
//功能也要增加
super.cg.add();
//给出计划
super.rg.plan();
}
}
Invoker:
public class Invoker {
//什么命令
private Command command;
//客户发出命令
public void setCommand(Command command){
this.command = command;
}
//执行客户的命令
public void action(){
this.command.execute();
}
}
Client:
public class Client {
public static void main(String[] args) {
//定义我们的接头人
Invoker xiaoSan = new Invoker(); //接头人就是我小三
//客户要求增加一项需求
System.out.println("-------------客户要求增加一项需求-----------------");
//客户给我们下命令来
Command command = new AddRequirementCommand();
//接头人接收到命令
xiaoSan.setCommand(command);
//接头人执行命令
xiaoSan.action();
}