ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式之命令模式

2021-02-19 10:01:41  阅读:129  来源: 互联网

标签:对象 接收者 模式 命令 Command receiver 设计模式 public


背景

当需要向某些对象发起请求,但是并不知道请求的接受者是谁,也不知道被请求的操作时哪个,使得请求的发送者与接收者取消解耦。

定义

命令模式,将一个请求封装为一个对象,从而使可用不同的请求对客户端进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作

说白了,就是将一系列命令封装起来,不直接调用真正执行者的方法,这样比较好扩展。

模式结构

命令模式包含如下角色:

Command :抽象命令类

抽象出命令对象,可以根据不同的命令类型写出不同的实现类;

定义命令的接口,声明执行的方法

ConcreteCommand :具体命令类

实现了抽象命令对象的具体实现

命令接口实现对象

lnvoker :调用者

请求的发送者,它通过命令对象来执行请求。一个调用者并不需要再设计时确定其接收者,因此它只与抽象命令之间存在关联。在程序运行时,将调用命令对象的 execute(),间接调用接收者的相关操作

真正执行命令的对象,任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。

Receliver :接收者

接收者执行与请求相关的操作,真正执行命令的对象。具体实现对请求的业务处理。未抽象前,实际执行操作内容的对象

使用命令对象的入口,是客户端真正触发命令并要求命令执行相应操作的地方,通常会持有命令对象,可以持有很多的命令对象

Client :客户类

在客户端中需要创建调用者对象,具体命令类对象,在创建具体命令对象时指定相应的接收者。发送者和接收者之间没有关联,都通过命令对象来调用

命令模式的优点是 命令记录/撤销功能,可以批次执行命令,并且命令的产生与执行解耦,生成新的命令不需要修改源代码

创建具体的命令对象,并设置命令对象的接收者。注意这个不是我们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个Client称为装配者会更好理解,因为真正使用命令的客户端是从Invoker来触发执行。

 1 // 客户端,请求者,命令接口,命令实现,接收者
 2 public class Client {
 3     public static void main(String[] args) {
 4         Receiver receiver = new Receiver();
 5         Command commandOne = new ConcreteCommandOne(receiver);
 6         Command commandTwo = new ConcreteCommandTwo(receiver);
 7         Invoker invoker = new Invoker(commandOne, commandTwo);
 8         invoker.actionOne();
 9         invoker.actionTwo();
10 
11     }
12 }
 1 // 命令管理者 调用者
 2 public class Invoker {
 3     private Command commandOne;
 4     private Command commandTwo;
 5 
 6     public Invoker(Command commandOne, Command commandTwo) {
 7         this.commandOne = commandOne;
 8         this.commandTwo = commandTwo;
 9     }
10 
11     public void actionOne() {
12         commandOne.execute();
13     }
14 
15     public void actionTwo() {
16         commandTwo.execute();
17     }
18 }
1 // 抽象命令类
2 public interface Command {
3     void execute();
4 }
 1 // 具体命令类01
 2 public class ConcreteCommandOne implements Command {
 3     private Receiver receiver;
 4 
 5     public ConcreteCommandOne(Receiver receiver) {
 6         this.receiver = receiver;
 7     }
 8 
 9     public void execute() {
10         receiver.actionOne();
11     }
12 }
 1 // 具体命令类02
 2 public class ConcreteCommandTwo implements Command {
 3     private Receiver receiver;
 4 
 5     public ConcreteCommandTwo(Receiver receiver) {
 6         this.receiver = receiver;
 7     }
 8 
 9     public void execute() {
10         receiver.actionTwo();
11     }
12 }
 1 // 接收者
 2 public class Receiver {
 3     public Receiver() {
 4 
 5     }
 6 
 7     public void actionOne() {
 8         System.out.println("ActionOne has been taken.");
 9     }
10 
11     public void actionTwo() {
12         System.out.println("ActionTwo has been taken.");
13     }
14 }

 

 

标签:对象,接收者,模式,命令,Command,receiver,设计模式,public
来源: https://www.cnblogs.com/MAQ-space/p/14412171.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有