命令模式:将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日记,以及支持可撤销的操作。
简单描述:1个Receiver,知道如何执行命令。1个抽象命令,持有一个Receiver的引用,命令的执行则调用Receiver的对应方法(具体命令具体调用相应的方法)。1个Invoker,只有命令的引用(可以是一个或多个),接收命令,并且执行命令的执行方法。客户端知道Receiver、生成命令给Invoker,由Invoker去调用命令自己的执行方法
大话设计模式中的截图:
代码例子:
Receiver类:
1 package com.longsheng.command;
2
3 public class Receiver {
4
5 public void actionA() {
6 System.out.println("执行请求A");
7 }
8
9 public void actionB() {
10 System.out.println("执行请求B");
11 }
12 }
抽象Command类:
1 package com.longsheng.command;
2
3 public abstract class Command {
4
5 protected Receiver mReceiver;
6
7 public Command( Receiver mReceiver ) {
8 this.mReceiver = mReceiver;
9 }
10
11 public void execute() {
12
13 }
14
15 }
ConcreteCommandA类:
1 package com.longsheng.command;
2
3 public class ConcreteCommandA extends Command {
4
5 public ConcreteCommandA(Receiver mReceiver) {
6 super(mReceiver);
7 }
8
9 @Override
10 public void execute() {
11 mReceiver.actionA();
12 }
13
14 }
ConcreteCommandB类:
1 package com.longsheng.command;
2
3 public class ConcreteCommandB extends Command {
4
5 public ConcreteCommandB(Receiver mReceiver) {
6 super(mReceiver);
7 }
8
9 @Override
10 public void execute() {
11 mReceiver.actionB();
12 }
13
14 }
Invoker类:
1 package com.longsheng.command;
2
3 public class Invoker {
4
5 private Command mCommand;
6
7 public void setCommand(Command mCommand) {
8 this.mCommand = mCommand;
9 }
10
11 public void executeCommand() {
12 mCommand.execute();
13 }
14
15 }
客户端代码:
1 package com.longsheng.command;
2
3 public class Client {
4
5 public static void main(String args[]) {
6 Receiver mReceiver = new Receiver();
7 Command mCommandA = new ConcreteCommandA(mReceiver);
8 Command mCommandB = new ConcreteCommandB(mReceiver);
9 Invoker mInvoker = new Invoker();
10
11 mInvoker.setCommand(mCommandA);
12 mInvoker.executeCommand();
13
14 mInvoker.setCommand(mCommandB);
15 mInvoker.executeCommand();
16 }
17
18 }
运行结果:
1 执行请求A
2 执行请求B
命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分隔开。
如果不清楚一个系统是否需要命令模式,一般就不要着急去实现它,事实上,在需要的时候通过重构实现这个模式并不困难,只有在真正需要如撤销/恢复操作等功能时,把原来的代码重构为命令模式才有意义。
时间: 2024-12-28 11:23:42