命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。命令模式是一个高内聚的模式。
优点:
类间解耦;可扩展性;命令模式结合其他模式会更优秀缺点: 使用命令模式可能会导致某些系统有过多的具体命令类。
在该类图中,主要与三个角色:
Receice接收者对象:该角色就是干活的角色,命令应该是在这里执行;Command命令角色:需要执行的所有命令在该类中声明;Invoker调用者角色:接收到命令,并执行命令。例如:在软件开发公司,都是会分不同的组,有不同的组长,然后又项目经理管理、下达命令。直接上类图:
首先创建一个抽象的组类
public abstract class Group { public abstract void find(); public abstract void uodate(); public abstract void delete(); public abstract void add(); public abstract void change(); }创建三个具体的组:
public class CodeGroup extends Group { @Override public void find() { System.out.println("找到程序组"); } @Override public void update() { System.out.println("需要更新功能"); } @Override public void delete() { System.out.println("需要删除功能"); } @Override public void add() { System.out.println("需要添加功能"); } } public class PageGroup extends Group{ @Override public void find() { System.out.println("找到前端组"); } @Override public void update() { System.out.println("需要修改页面"); } @Override public void delete() { System.out.println("需要删除页面"); } @Override public void add() { System.out.println("需要添加页面"); } } public class RequirementGroup extends Group { @Override public void find() { System.out.println("找到需求组"); } @Override public void update() { System.out.println("需要更新需求"); } @Override public void delete() { System.out.println("需要删除需求"); } @Override public void add() { System.out.println("需要添加需求"); } }创建抽象的命令类
public abstract class Command { //定义好具体的组,子类可以直接使用 protected CodeGroup codeGroup = new CodeGroup(); protected PageGroup pageGroup = new PageGroup(); protected RequirementGroup requirementGroup = new RequirementGroup(); public abstract void execute(); }创建具体的命令类
public class UpdatePageCommand extends Command { @Override public void execute() { //找到前端组 super.pageGroup.find(); //更新页面 super.pageGroup.update(); } } public class AddRequirementCommand extends Command { @Override public void execute() { super.requirementGroup.find(); super.requirementGroup.add(); } }创建命令的负责人,也就是下达命令的类:
public class Invoker { private Command command; public void setCommand(Command command) { this.command = command; } public void action(){ this.command.execute();; } }场景类,也就是我们这里的客户:
public class Client { public static void main(String[] args){ Invoker invoker = new Invoker(); System.out.println("客户提出修改页面"); Command command = new UpdatePageCommand(); invoker.setCommand(command); invoker.action(); System.out.println("\n客户提出新的需求"); Command command1 = new AddRequirementCommand(); invoker.setCommand(command1); invoker.action(); } }