定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。它是一个高内聚的模式。
命令模式有三个角色
Receiver接收者角色 命令传递到这里是应该被执行的,(是下例中的group的三个实现类)。
Command 命令角色 需要执行的所有命令都在这里声明
invoker 调用者角色 接收到命令,并执行命令。
优点:类间解耦,调用者与接收者角色之间没有任何的依赖关系,调用者实现功能时需调用Command抽象类的execute方法就可以,不需要了解到底是哪个接收者执行。
可扩展性 Command的子类可以非常容易的扩展,而调用者Invoker和高层次的模块client不产生严重的代码耦合。
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 CodeGroup extends Group{
@Override
public void find() {
System.out.println("find codeGroup");
}
@Override
public void add() {
System.out.println("add code");
}
@Override
public void delete() {
System.out.println("delete code");
}
@Override
public void change() {
System.out.println("change code");
}
@Override
public void plan() {
System.out.println("plan code");
}
}
public class PageGroup extends Group{
@Override
public void find() {
System.out.println("find pageGroup");
}
@Override
public void add() {
System.out.println("add a page");
}
@Override
public void delete() {
System.out.println("delete one page");
}
@Override
public void change() {
System.out.println("page change");
}
@Override
public void plan() {
System.out.println("page plan");
}
}
public class RequirementGroup extends Group{
@Override
public void find() {
System.out.println("find rp");
}
@Override
public void add() {
System.out.println("add rp");
}
@Override
public void delete() {
System.out.println("delete rp");
}
@Override
public void change() {
System.out.println("change rp");
}
@Override
public void plan() {
System.out.println("plan rp");
}
}
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 DeletePageCommand extends Command {
@Override
public void execute() {
super.pageGroup.find();
super.pageGroup.delete();
super.pageGroup.plan();
}
}
public class AddRequirementCommand extends Command {
@Override
public void execute() {
super.requirementGroup.find();
super.requirementGroup.add();
super.requirementGroup.plan();
}
}
public class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void action (){
command.execute();
}
}
public class Client {
public static void main(String[] args){
Invoker invoker = new Invoker();
invoker.setCommand(new AddRequirementCommand());
invoker.action();
}
}