命令模式
定义:
在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。而命令模式就是将“行为请者”与“行为实现者”解耦的。
类图:
举例(客户提出需求给需求部门、美工部门、开发部门):
描述:
客户(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(); }