参考:设计模式之禅
1. 例子
public interface Group {
void find();
void add();
void delete();
void change();
void plan();
}
public class PageGroup implements Group {
@Override
public void find() {
System.out.println("find page group");
}
@Override
public void add() {
System.out.println("add new page");
}
@Override
public void delete() {
System.out.println("delete page");
}
@Override
public void change() {
System.out.println("change page");
}
@Override
public void plan() {
System.out.println("do a page plan");
}
}
.......
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 AddRequireCommandCommand extends Command {
@Override
public void execute() {
super.requirementGroup.find();
super.requirementGroup.delete();
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();
Command deletePageCommand = new DeletePageCommand();
invoker.setCommand(deletePageCommand);
invoker.action();
}
}
2. 定义
把不同的请求封装成不同的对象,使客户端参数化。提供命令的撤销和恢复功能。
public abstract class Receiver {
public abstract void doSomething();
}
public class ConcreteReceiver1 extends Receiver {
@Override
public void doSomething() {
System.out.println("concreteReceiver1 do something");
}
}
public abstract class Command {
public abstract void execute();
}
public class ConcreteCommand extends Command {
private Receiver receiver;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
this.receiver.doSomething();
}
}
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) {
ConcreteReceiver1 concreteReceiver1 = new ConcreteReceiver1();
ConcreteCommand concreteCommand = new ConcreteCommand(concreteReceiver1);
Invoker invoker = new Invoker();
invoker.setCommand(concreteCommand);
invoker.action();
}
}
3. 应用
3.1 优点
- 类间解耦,调用者和接受者无依赖关系;
- 可扩展性,Command类很容易扩展;
- 结合其他模式,结合责任链模式,实现命令组解析任务;结合模板方法,减少Command子类膨胀问题。
3.2 缺点
Command子类膨胀问题。