目录
  1. 1. 命令模式
    1. 1.1. 定义
    2. 1.2. 命令模式的示意图
    3. 1.3. 代码实现
      1. 1.3.1. 接收者
      2. 1.3.2. 命令
      3. 1.3.3. 调用者
      4. 1.3.4. 场景实现
    4. 1.4. 应用场景
    5. 1.5. 命令模式的优缺点
      1. 1.5.1. 优点
      2. 1.5.2. 缺点
命令模式

命令模式

定义

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

命令模式的示意图

代码实现

接收者

客户最终调用的角色

  1. 抽象接收者
1
2
3
4
5
6
7
8
9
package org.example.command;

/**
* 抽象接收者
*/
public abstract class Receiver {
/* 接收者需要处理的业务逻辑 */
public abstract void receive();
}
  1. 具体接收者
1
2
3
4
5
6
7
8
9
10
11
package org.example.command;

/**
* 具体接收者,接收者是命令模式的主体,命令模式最终调用的还是接收者,获取接收者的信息
*/
public class ConcreteRecevier1 extends Receiver {
@Override
public void receive() {
System.out.println("需要执行的命令需求");
}
}

命令

调用接收者

  1. 抽象命令
1
2
3
4
5
6
7
8
package org.example.command;
/**
* 抽象命令
*/
public abstract class Command {
/* 执行接收者 */
public abstract void execute();
}
  1. 具体命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package org.example.command;

/**
* 具体命令,是用来执行接收者,获取接收者信息的
*/
public class ConcreteCommand1 extends Command {
private Receiver receiver ;
/* 初始化接收者 */
public ConcreteCommand1(Receiver receiver){
this.receiver = receiver ;
}

/**
* 执行接收者
*/
@Override
public void execute() {
this.receiver.receive();
}
}

调用者

调用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package org.example.command;

/**
* 调用者,是调用命令,最终我们需要使用调用者来调用命令,而调用接收者
*/
public class Invoker {
private Command command ;

/* 接受命令 */
public void setCommand(Command command){
this.command = command ;
}

/* 执行命令 */
public void action(){
this.command.execute();
}
}

场景实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class App {
/**
* 命令模式
* @param args
*/
public static void main(String[] args) {
/* 创建接收者 */
Receiver receiver = new ConcreteRecevier1();
/* 创建命令,用来调用接收者 */
Command command = new ConcreteCommand1(receiver);

/* 创建调用者,用来调用命令 */
Invoker invoker = new Invoker();

/* 设置命令 */
invoker.setCommand(command);

/* 执行命令 */
invoker.action();
}
}

应用场景

  1. 在gui开发中可以采用命令模式。一个按钮点击就是一个命令。
  2. 模拟dos和shell命令也可以采用命令模式。

命令模式的优缺点

优点

  1. 类间解耦。各个角色之间没有依赖关系。
  2. 可扩展性强,命令和接收者都可以扩展。
  3. 命令模式可以与其他模式结合使用。比如结合责任链模式实现命令族解析,结合模板方法模式减少类膨胀问题。

缺点

  1. 有类膨胀问题。命令和接收者虽然可以无限扩展,但会出现类膨胀。
文章作者: rack-leen
文章链接: http://yoursite.com/2020/01/04/Java/Java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E8%A1%8C%E4%B8%BA%E5%9E%8B%E6%A8%A1%E5%BC%8F/%E5%91%BD%E4%BB%A4%E6%A8%A1%E5%BC%8F/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 rack-leen's blog
打赏
  • 微信
  • 支付宝

评论