Command 命令模式
目录
[TOC]
1. 概述
1.1. 设计模式定义
通过封装一组完全不相关的对象相互之间的的交互及通讯来完成松耦合。
允许某一个对象的行为的变化是独立于其他对象的。
1.2. 自我理解
命令模式是一种行为模式,因此,它处理的是对象的行为。命令模式为系统中不同的对象提供中性化的交流媒介
1.3. 命令模式的组成
命令接口 (Command):定义命令的接口,声明执行的方法。
具体命令 (ConcreteCommand):命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
接受者 (Receiver):接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
调用者 (Invoker):要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。
客户 (Client):创建具体的命令对象,并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个 Client 称为装配者会更好理解,因为真正使用命令的客户端是从 Invoker 来触发执行。
2. UML
3. Example
3.1. 场景
电脑有开机、关机、使用软件等相关功能,用户操作按钮、鼠标、键盘等即可使用电脑,发送一系列指令,电脑执行即可。
3.2. 代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
/** * Created * Date: 2021/06/23 17:21 <br/> * Description: 命令模式 * * @author jomin@loserzhao.com * @see */ public class CommandPatternDemo { public static void main(String[] args) { PC pc = new PC(); Command startCommand = new StartCommand(pc); Command openOfficeCommand = new OpenOfficeCommand(pc); Command shutdownCommand = new ShutdownCommand(pc); Key key = new Key(); key.setStartCommand(startCommand); key.setOpenOfficeCommand(openOfficeCommand); key.setShutdownCommand(shutdownCommand); key.start(); key.openOffice( "WeChat"); key.openOffice( "IntelliJ IDEA"); key.shutdown(); } /** * Author: jomin@loserzhao.com <br/> * Date: 15:38 2021-07-12 <br/> * Description: 角色:Receiver,电脑。 */ public static class PC { public void start() { System.out.println("开机"); } public void openOffice(String officeName) { System.out.println("打开办公软件[" + officeName + "]"); } public void shutdown() { System.out.println("关机"); } } public interface Command { void execute(); } public static class StartCommand implements Command { private PC pc; StartCommand(PC pc) { this.pc = pc; } public void execute() { pc.start(); } } public static class OpenOfficeCommand implements Command { private PC pc; private String officeName; OpenOfficeCommand(PC pc) { this.pc = pc; } public void setOfficeName(String officeName) { this.officeName = officeName; } public void execute() { pc.openOffice(officeName); } } public static class ShutdownCommand implements Command { private PC pc; ShutdownCommand(PC pc) { this.pc = pc; } public void execute() { pc.shutdown(); } } /** * Author: jomin@loserzhao.com <br/> * Date: 15:29 2021-07-12 <br/> * Description: 角色:Invoker,按键 */ public static class Key { private Command startCommand; private OpenOfficeCommand openOfficeCommand; private Command shutdownCommand; public void setStartCommand(Command startCommand) { this.startCommand = startCommand; } public void setOpenOfficeCommand(Command openOfficeCommand) { this.openOfficeCommand = (OpenOfficeCommand)openOfficeCommand; } public void setShutdownCommand(Command shutdownCommand) { this.shutdownCommand = shutdownCommand; } public void start(){ System.out.println("check start permission"); startCommand.execute(); System.out.println("invoker start done!"); System.out.println("============================================"); } public void openOffice(String officeName){ System.out.println("check open office permission"); openOfficeCommand.setOfficeName(officeName); openOfficeCommand.execute(); System.out.println("invoker open office done!"); System.out.println("============================================"); } public void shutdown(){ System.out.println("check shutdwon permission"); shutdownCommand.execute(); System.out.println("invoker shutdwon done!"); System.out.println("============================================"); } } } |
原创文章,转载请注明: 转载自LoserZhao – 诗和远方[ http://www.loserzhao.com/ ]
本文链接地址: http://www.loserzhao.com/java/designpattern/command-designpattern.html
文章的脚注信息由WordPress的wp-posturl插件自动生成
0 条评论。