简介
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。命令模式是一个高内聚的模式。
优点:
- 类间解耦;
- 可扩展性;
- 命令模式结合其他模式会更优秀
缺点:
使用命令模式可能会导致某些系统有过多的具体命令类。
类图
在该类图中,主要与三个角色:
- Receice接收者对象:该角色就是干活的角色,命令应该是在这里执行;
- Command命令角色:需要执行的所有命令在该类中声明;
- Invoker调用者角色:接收到命令,并执行命令。
例如:在软件开发公司,都是会分不同的组,有不同的组长,然后又项目经理管理、下达命令。直接上类图:
Java代码实现
首先创建一个抽象的组类
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();
}
}