命令模式的两种不同实现
转载自 命令模式(Command)的两种不同实现
- //抽象接收者,定义了每个接收者应该完成的业务逻辑
- abstract class AbstractReceiver {
- public abstract void doJob();
- }
- // 具体接收者01,实现自己真正的业务逻辑
- class Receiver01 extends AbstractReceiver {
- public void doJob() {
- System.out.println("接收者01 完成工作 ...\n");
- }
- }
- // 具体接收者02,实现自己真正的业务逻辑
- class Receiver02 extends AbstractReceiver {
- public void doJob() {
- System.out.println("接收者02 完成工作 ...\n");
- }
- }
- // 抽象命令类,定义了每个具体命令被执行的入口方法execute()
- abstract class AbstractCommand {
- public abstract void execute();
- }
- // 具体命令类01,通过构造函数的参数决定了该命令由哪个接收者执行
- class Command01 extends AbstsractCommand {
- private AbstractReceiver receiver = null;
- public Command01(AbstractReceiver receiver) {
- this.receiver = receiver;
- }
- public void execute() {
- System.out.println("命令01 被发布 ...");
- this.receiver.doJob();
- }
- }
- // 具体命令类02,通过构造函数的参数决定了该命令由哪个接收者执行
- class Command02 extends AbstractCommand {
- private AbstractReceiver receiver = null;
- public Command02(AbstractReceiver receiver) {
- this.receiver = receiver;
- }
- public void execute() {
- System.out.println("命令02 被发布 ...");
- this.receiver.doJob();
- }
- }
- // 调用者,负责将具体的命令传送给具体的接收者
- class Invoker {
- private AbstractCommand command = null;
- public void setCommand(AbstractCommand command) {
- this.command = command;
- }
- public void action() {
- this.command.execute();
- }
- }
- //测试类
- public class Client {
- public static void main(String[] args) {
- // 创建调用者
- Invoker invoker = new Invoker();
- // 创建一个具体命令,并指定该命令被执行的具体接收者
- AbstractCommand command01 = new Command01(new Receiver01());
- // 给调用者发布一个具体命令
- invoker.setCommand(command01);
- // 调用者执行命令,其实是将其传送给具体的接收者并让其真正执行
- invoker.action();
- AbstractCommand command02 = new Command01(new Receiver02());
- invoker.setCommand(command02);
- invoker.action();
- }
- }
命令01 被发布 ...
接收者01 完成工作 ...
命令02 被发布 ...
接收者02 完成工作 ...
|
- /*
- * 抽象命令类,使用构造函数的传入参数预先内定具体接收者, 若想使用其他接收者,可在子类的构造函数中传入
- */
- abstract class AbstractCommand {
- protected AbstractReceiver receiver = null;
- public AbstractCommand(AbstractReceiver receiver) {
- this.receiver = receiver;
- }
- public abstract void execute();
- }
- // 具体命令类01,提供无参、有参两种构造函数
- class Command01 extends AbstractCommand {
- // 使用无参构造函数来默认使用的具体接收者
- public Command01() {
- super(new Receiver01());
- }
- // 使用有参构造函数来指定具体的接收者
- public Command01(AbstractReceiver receiver) {
- super(receiver);
- }
- public void execute() {
- System.out.println("命令01 被发布 ...")
- this.receiver.doJob();
- }
- }
- // 具体命令类02,提供无参、有参两种构造函数
- class Command02 extends AbstractCommand {
- // 使用无参构造函数来默认使用的具体接收者
- public Command02() {
- super(new Receiver02());
- }
- // 使用有参构造函数来指定具体的接收者
- public Command02(AbstractReceiver receiver) {
- super(receiver);
- }
- public void execute() {
- System.out.println("命令02 被发布 ...")
- this.receiver.doJob();
- }
- }
- // 测试类
- public class Client {
- public static void main(String[] args) {
- // 创建调用者
- Invoker invoker = new Invoker();
- // 创建一个具体命令,并指定该命令被执行的具体接收者
- // AbstractCommand command01 = new Command01(new Receiver01());
- AbstractCommand command01 = new Command01();
- // 给调用者发布一个具体命令
- invoker.setCommand(command01);
- // 调用者执行命令,其实是将其传送给具体的接收者并让其真正执行
- invoker.action();
- // AbstractCommand command02 = new Command01(receiver02);
- AbstractCommand command02 = new Command02();
- invoker.setCommand(command02);
- invoker.action();
- System.out.println("\n设置命令01由接收者02执行...");
- command01 = new Command01(new Receiver02());
- invoker.setCommand(command01);
- invoker.action();
- }
- }
命令01 被发布 ...
接收者01 完成工作 ...
命令02 被发布 ...
接收者02 完成工作 ...
设置命令01由接收者02执行...
命令01 被发布 ...
接收者02 完成工作 ...
|
此时在客户端中,我们不指明一个命令的具体接收者(执行者)也同样可以达到第一种实现方法中的效果。此外,客户也可以显式指出具体接收者,就像上面那样。
命令模式的两种不同实现相关推荐
- 进Linux系统单用户模式,Linux进入单用户模式的两种方法
单用户模式的作用 在使用Linux系统中,维护人员经常会碰到一个问题,就是在拥有root账号权限和密码的用户中,总是会出现忘记root密码的情况. 遇到这种情况,一般情况下,维护人员就会通过最常用的方 ...
- windows系统中,在当前目录下打开cmd命令行的两种方法
windows系统中,在当前目录下打开cmd命令行的两种方法 1.在当前路径地址栏中直接输入'cmd',然后回车. 2.在当前路径下,按住'shift'键同时点击鼠标右键,点击"在此处打开P ...
- FPGA Verilog AD7606驱动代码,包含SPI模式读取和并行模式读取两种
FPGA Verilog AD7606驱动代码,包含SPI模式读取和并行模式读取两种,代码注释详细 编号:7428665912784264白衫如初oh
- PPT“放映模式”的两种设置方法
做好的PPT文件要如何放映呢?下面来说说设置PPT放映模式的两种方法. 方法一,直接在PPT文件里设置播放幻灯片. 1.打开PPT后,点击菜单栏[幻灯片放映]选项下的[设置幻灯片放映]. 2.弹出对话 ...
- ftp服务器的运行模式,FTP两种模式详解和实践技巧
笔者最近几天被FTP折腾了一下,简单的路由器ACL就是无法通过被动模式的FTP流量.经数次实验和度娘.谷哥指导,终于对FTP模式有了深入理解.先感叹一句,以前学艺不精,书到用时方恨少! 不必要对FTP ...
- linux怎么配置命令模式,Linux几种命令模式
原标题:Linux几种命令模式 必须掌握的几个Linux命令 我们为什么要学习Linux的命令? 初学者上手Linux系统会很懵.不管你是否安装了图形化界面,或者去网上找一些教程.或者一些Linux的 ...
- SSH远程管理、参数讲解、xshell使用、scp,sftp,ssh命令(ssh两种方式的密钥验证方...
1.SSH远程管理 SSH(Secure Sheel)是一种安全通道协议,主要用于实现字符界面的远程登录.远程复制等功能.SSH协议对通信双方的数据传输进行了加密处理,其中包括用户的口令.与早期的TE ...
- PPT设置“只读模式”的两种方法
想要防止PPT文件被意外更改,或者禁止他人随意更改,我们可以给PPT设置保护模式,而PPT的"只读模式"就起到了这样的作用. 具体的设置方法有两种,我们可以根据不同需求选择合适的 ...
- 设置Excel表格“只读模式”的两种方法
Excel表格的"只读模式"可以帮助我们防止意外更改表格,根据不同需求,表格可以设置"有密码"和"无密码"的两种"只读模式&quo ...
最新文章
- php安装pear和phpunit
- ios学习——键盘的收起
- mysql 更改数据库编码_更改MySQL数据库的编码为utf8mb4
- pcb成型板aoi检测_缺陷检测 | PCB AOI质量检测之自动定位核选取算法
- 取某个日期所在周的任意一天日期
- boost::math模块两个 Lambert W 函数的最基本调用示例
- c++ 标准库中 cin.ignore()
- SPOJ- QTREE+HDU 3966(树链剖分裸题
- 小甲鱼 OllyDbg 教程系列 (一) :二进制破解科普系列之 ReverseMe
- html颜色代码表_html颜色代码表
- java txt中统计一个字母出现的次数并储存,统计txt文件中每个字符出现的次数,并根据次数从高到低排序...
- PS使用:windows解决Adobe Photoshop 2020(PS2020)闪退
- 6种展示代码的绝佳方式
- 基于SSM的医院病历管理系统
- c#实现Udp通信(四)--UPD大数据量接收(异步接收)
- python制作qq登录界面_用Python实现一个最新QQ办公版(TIM)的登录界面
- MySQL面试题——聚簇索引和非聚簇索引
- 简单的python小程序祝福母亲,母亲节快乐!
- 俄罗斯方块源代码Github
- 洞口四中2021高考成绩查询,常德高考成绩查询入口2021
热门文章
- 《C++ Primer》7.2节练习
- 洛谷 P1596 [USACO10OCT]Lake Counting S-dfs
- Zookeeper实践与应用--分布式锁实现
- python正态分布函数_python3-正态分布
- P2596 [ZJOI2006]书架(fhq treap)
- 观星(计算几何/凸包/多边形面积)
- P4239 任意模数多项式乘法逆(多项式/ MTT)
- Codeforces Round #715 (Div. 2) C. The Sports Festival 区间dp
- 斜堆学习笔记+复杂度证明
- 【NOI2013】快餐店【基环树】【树的直径】【set】