【设计模式】—— 命令模式Commond
时间:2022-04-22
本文章向大家介绍【设计模式】—— 命令模式Commond,主要内容包括模式意图、应用场景、模式结构、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
模式意图
将一个请求封装成一个对象,从而对这个命令执行撤销、重做等操作。
典型的Eclipse开发中,编辑器的操作就需要用到这个模式,比如Undo、Redo等等。
另外这个模式使得一个命令的触发与接收解耦,这样我们就可以演变成把感兴趣的对象接收这个命令,当命令触发时,这些对象就会执行操作。这个机制也是java事件的处理方式。
应用场景
1 命令抽象成对象
2 在不同的时刻,指定或者排队命令
3 支持 Undo或者Redo等操作
4 修改日志,当系统崩溃时,利用修改日志执行撤销
5 原语操作上构造一个高层系统(不理解)
模式结构
Invoker 命令的触发者,触发一个命令的执行。
/**
* 命令的触发者,发送命令
* @author xingoo
*
*/
class Invoker{
private Commond commond;
public Invoker(Commond commond) {
this.commond = commond;
}
public void action(){
commond.excute();
}
}
Receiver 命令的接受者,针对命令,执行一定的操作。
/**
* 命令的接受者,负责接收命令,进行处理
* @author xingoo
*
*/
class Receiver{
public Receiver() {
}
public void action(){
System.out.println("Action of receiver!");
}
}
Commond 命令的抽象接口
/**
* 命令接口,定义命令的统一接口
* @author xingoo
*
*/
interface Commond{
public void excute();
}
ConcreteCommond 具体的命令,关联一个接收者对象,当命令执行时,执行这个接收者对应的操作。
/**
* 具体的命令
* @author xingoo
*
*/
class ConcreteCommond implements Commond{
private Receiver receiver;
public ConcreteCommond(Receiver receiver) {
this.receiver = receiver;
}
public void excute() {
receiver.action();
}
}
全部代码
1 package com.xingoo.Commond;
2 /**
3 * 命令的触发者,发送命令
4 * @author xingoo
5 *
6 */
7 class Invoker{
8 private Commond commond;
9
10 public Invoker(Commond commond) {
11 this.commond = commond;
12 }
13
14 public void action(){
15 commond.excute();
16 }
17 }
18 /**
19 * 命令的接受者,负责接收命令,进行处理
20 * @author xingoo
21 *
22 */
23 class Receiver{
24
25 public Receiver() {
26
27 }
28
29 public void action(){
30 System.out.println("Action of receiver!");
31 }
32 }
33 /**
34 * 命令接口,定义命令的统一接口
35 * @author xingoo
36 *
37 */
38 interface Commond{
39 public void excute();
40 }
41 /**
42 * 具体的命令
43 * @author xingoo
44 *
45 */
46 class ConcreteCommond implements Commond{
47
48 private Receiver receiver;
49
50 public ConcreteCommond(Receiver receiver) {
51 this.receiver = receiver;
52 }
53
54 public void excute() {
55 receiver.action();
56 }
57
58 }
59 /**
60 * 客户端调用者
61 * @author xingoo
62 *
63 */
64 public class Client {
65 public static void main(String[] args) {
66 Receiver receiver = new Receiver();
67 Commond commond = new ConcreteCommond(receiver);
68 System.out.println("Commond register in here!");
69
70 try {
71 Thread.sleep(3000);
72 } catch (InterruptedException e) {
73 // TODO Auto-generated catch block
74 e.printStackTrace();
75 }
76
77 System.out.println("Commond excute in here!");
78 Invoker invoker = new Invoker(commond);
79 invoker.action();
80 }
81 }
运行结果
Commond register in here!
Commond excute in here!
Action of receiver!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- codeforces 1296D(贪心)
- codeforces 1399D
- JSP开发之JSTL介绍和使用
- codeforces 1283E(贪心)
- codeforces1216C (矩形面积交)
- codeforces 1234C(思维)
- codeforces 1405B(思维)
- codeforces 1216D(数学)
- codeforces 1256D(优先队列+贪心)
- codeforces 1343D(差分数组)
- codeforces1385D (递归+分治)
- codeforces1294D(思维+暴力)
- codeforces 1367D(思维)
- 数据库事务处理与资源池
- codeforces 1328D(思维)