命令模式--烤羊肉串引起来的思考
命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
命令模式作用:1、它能较容易地设计一个命令队列;2、在需要的情况下,可以叫容易地将命令记入日志3、允许接收请求的一方决定是否要否决请求。4、可以容易地实现对请求的撤销和重做5、由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。
最关键的优点就是命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分隔开。
以下是代码示例:
1 //Invoker类,要求该命令执行这个请求 2 public class Invoker { 3 private Command command; 4 public void setCommand(Command command){ 5 this.command = command; 6 } 7 public void executeCommand(){ 8 command.execute(); 9 } 10 }
1 //Command类,用来声明执行操作的接口. 2 public abstract class Command { 3 protected Receiver receiver; 4 5 public Command(Receiver receiver){ 6 this.receiver = receiver; 7 } 8 //执行命令 9 abstract public void execute(); 10 }
1 //ConcreteCommand类,将一个接收者对象绑定于一个动作,调用接收者相应操作,以实现execute。 2 public class ConcreteCommand extends Command{ 3 //构造方法 4 public ConcreteCommand(Receiver receiver) { 5 super(receiver); 6 } 7 8 //执行命令 9 @Override 10 public void execute() { 11 receiver.action(); 12 } 13 14 }
1 //Receiver类,知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者。 2 public class Receiver { 3 4 public void action(){ 5 System.out.println("执行请求"); 6 } 7 }
1 //客户端测试类 2 public class TestClinet { 3 public static void main(String[] args) { 4 Receiver r = new Receiver(); 5 Command c = new ConcreteCommand(r); 6 Invoker i = new Invoker(); 7 i.setCommand(c); 8 i.executeCommand();//执行请求 9 } 10 }
UML图:
不能只满足于写完代码运行结果正确就完事,时常考虑如何让代码更加简练更加容易维护、容易扩展和复用,只有这样才可以真正得到提高
--《来自大话设计模式》