《设计模式之禅》学习笔记(十五)

命令模式的定义:

Encapsulat a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.(将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。)

 

命令模式的通用类图:

 

三种角色:

  • Receiver 接受者角色,命令传递到这里被执行。
  • Command 命令角色,需要执行的所有命令都在这里声明。
  • Invoker 调用者角色,接受到命令,并执行命令。

 

通用代码:

 

public abstract class Receiver {

	// 抽象接受者,定义每个接受者都必须完成的任务
	public abstract void doSomething();
	
}
public class ConcreteReceiver1 extends Receiver {

	@Override
	public void doSomething() {

	}

}
public class ConcreteReceiver2 extends Receiver {

	@Override
	public void doSomething() {

	}

}
public abstract class Command {

	protected final Receiver receiver;
	
	public Command(Receiver receiver) {
		this.receiver = receiver;
	}
	
	public abstract void execute();
	
}
public class ConcreteCommand1 extends Command {
	
	// 声明自己的默认接收者,这样高层次模块(调用者)就不需要知道接受者是谁
	public ConcreteCommand1() {
		super(new ConcreteReceiver1());
	}
	
	// 构造函数传递接收者
	public ConcreteCommand1(Receiver receiver) {
		super(receiver);
	}
	
	@Override
	public void execute() {
		// 业务处理
		this.receiver.doSomething();
	}

}
public class ConcreteCommand2 extends Command {
	
	// 声明自己的默认接收者
	public ConcreteCommand2() {
		super(new ConcreteReceiver2());
	}
	
	// 构造函数传递接收者
	public ConcreteCommand2(Receiver receiver) {
		super(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) {
		// 声明调用者Receiver
		Invoker invoker = new Invoker();
		// 定义一个发送给接受者的命令
		Command command = new ConcreteCommand1();
		// 把命令交给调用者去执行
		invoker.setCommand(command);
		invoker.action();
	}
	
}

 

 

命令模式的优点:

  • 类间解耦
  • 可扩展性
  • 命令模式结合其他模式会更优秀

 

命令模式的缺点:

类膨胀

posted @ 2012-12-31 17:50  qwertWZ  阅读(476)  评论(0编辑  收藏  举报