数学建模社区-数学中国
标题:
Java设计模式——命令模式
[打印本页]
作者:
杨利霞
时间:
2020-4-24 18:12
标题:
Java设计模式——命令模式
( [8 ^0 X1 u8 _, R2 F
Java设计模式——命令模式
y4 _6 r0 G* E* v
! w0 r6 X" @) u! J `
命令模式
4 Q& D+ M z% ~" L# W; W' s9 Z
' j) R* s- K: F: d! g2 k
命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:
1 J1 H" {: ]6 B& }
2020-4-24 18:11 上传
下载附件
(57.13 KB)
) ~' j4 b- b5 p! _1 R% J
Invoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码:
& C) t Q4 V% T2 r S5 J/ F
/ \1 ]; m- i. c9 L
public interface Command {
{3 h. P* c% n" a' O. i2 S' J
public void exe();
/ d; k. p" N1 A) A2 a2 x$ i
}
- S P8 j' a* b% ?, T
public class MyCommand implements Command {
/ I2 T6 {3 Y# G/ }+ ^, H/ e
5 E* g- [" m7 w
private Receiver receiver;
) q9 n9 t% V7 w M8 F, t$ o
: I( o. P- W, H0 K: @
public MyCommand(Receiver receiver) {
2 e0 e4 m( Q. X3 w
this.receiver = receiver;
5 Z4 I$ E; s/ J
}
' x- Y5 _' `$ U$ ~* Y
U% X/ W# d5 S' |
@Override
$ ]4 w* |8 d. D7 T4 m0 ~! C
public void exe() {
2 a: D. M$ ]* H! x# x2 s% h
receiver.action();
: |5 J; V* q. S% Y
}
" i7 j' O: J/ I- M2 z# w
}
4 r0 e+ H$ Q8 N& |1 O0 T0 E
public class Receiver {
3 m3 g+ q& T% M8 A
public void action(){
. d# c8 u0 j3 }; e' `
System.out.println("command received!");
+ k% o6 q+ P/ k- m5 h
}
+ T4 t! l: Q! ~; e. A
}
/ f' M% T! m' S5 B/ Z' o. c
public class Invoker {
# z$ h: _8 Y$ I! I, I
: s' q4 Z* u# ^. B4 p- K
private Command command;
! i5 T+ r. l* s* E2 x
1 i: o* f) q: N% j7 x
public Invoker(Command command) {
, u& U0 G) m# X( Q/ k& Z6 \. K( B
this.command = command;
: U% r; ?; _7 X4 q: ?( z
}
! l! U. }' J7 L- T) S
Q: T7 O, ?4 c3 d% \
public void action(){
8 u* `# @7 p" j' ^3 F5 z+ N
command.exe();
: S3 p0 B& ?7 X3 s+ O8 q
}
2 p* s- v/ G! I+ q
}
/ S$ \) n: T( V
public class Test {
* n* i- G' z" d6 i9 ]
. b6 f4 Y2 h8 ~3 G1 q$ J
public static void main(String[] args) {
0 b- o R; Z4 z
Receiver receiver = new Receiver();
9 q! W( s- S! W6 ~: P. o0 }
Command cmd = new MyCommand(receiver);
' w$ x* u8 \ l$ m% W3 k
Invoker invoker = new Invoker(cmd);
! [! H) \9 J9 V! @; ?8 i6 ^
invoker.action();
9 |7 \0 y! I7 J U. m# C8 }) N3 p
}
% C3 y( c$ P4 r
}
/ \" p/ I! v: m% R0 Z) V5 Z3 ^4 \
b) p M' H: g
' W0 @& o; R0 w
这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!
5 c6 z. u/ ^/ ?/ K; Z4 T& r
- V- Z6 Z0 V1 n( ^# y" f
介绍
& y- ]6 @; T# ]" f. @
意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
1 q5 ~8 A3 r: g2 E7 J
1 Y$ `* _1 l+ e: Q; U9 ~' G
主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
8 u; a3 w* ?2 {: U+ N4 b
( l& k5 |9 }+ ~7 k# i1 o
何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
: K* O" i7 L0 _% T y
* _( V: g5 S; m* j) [5 p) V9 G
如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。
% N- k1 F9 B$ d+ U9 `
2 ]9 V4 ~4 t1 S! \
关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口
3 @+ p* B, G3 ^
* q3 ^0 b- v3 p
应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。
7 k& \/ x+ d. p3 z
/ ~; J/ h7 }2 ~
优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
, w, s) L+ Z! A" L
4 x b/ ~; \1 v
缺点:使用命令模式可能会导致某些系统有过多的具体命令类。
+ c2 T0 u( h. c' Z1 f, d% W2 x
3 ~! K" }& ~2 t0 t
使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。
" W' E9 {3 s* n& h5 k
4 J( F( a$ _3 T& `7 |& u
注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。
. v$ F# s7 E5 [. d4 i
————————————————
2 b |6 U: F a) j3 k: [& }
版权声明:本文为CSDN博主「No_Game_No_Life_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
' L: Y3 N5 J" M! v6 C3 ? i3 p
原文链接:https://blog.csdn.net/No_Game_No_Life_/article/details/85989272
/ ?. l3 z4 i+ {# E& J. t' t n. H, w
3 [7 \4 }+ D- p! h7 e7 \4 N9 g
. ^- k4 x/ `3 T( K+ k+ o& X
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5