数学建模社区-数学中国
标题:
Java设计模式——命令模式
[打印本页]
作者:
杨利霞
时间:
2020-4-24 18:12
标题:
Java设计模式——命令模式
+ {/ C2 T* ^4 |4 K. c
Java设计模式——命令模式
, }' I. n2 i: V# |/ N ^* x2 ^: O
* E8 l/ a' o L5 J* A c
命令模式
+ D! c: W w9 }; e
& n* ~2 w% E* P$ d+ T" P! f" c
命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:
0 S0 {# ?5 h! c5 q3 u6 \ F
2020-4-24 18:11 上传
下载附件
(57.13 KB)
$ n' J8 l4 A% ]! w( @
Invoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码:
" l" \7 B4 v r" l6 y Z8 T
. _) F/ ?1 l9 u, d+ i l
public interface Command {
' l: [" F1 z, |( _. b8 c/ M; q
public void exe();
6 q- T! ~" p* a4 ~+ }7 s
}
7 F1 |! `* [$ T+ W
public class MyCommand implements Command {
. E% z0 [; ^% v( k' M3 o
" Y0 n0 W& z- S" j C, L" K8 }% ^
private Receiver receiver;
F L$ S- h: U }5 |& @
8 Q5 q4 y' g8 P6 _/ s
public MyCommand(Receiver receiver) {
; u. v6 ?. s+ t9 X7 r
this.receiver = receiver;
7 p$ j1 S' K3 ]5 ~# ]
}
! `* a* _% {/ L m
+ f1 B" Z( q2 H5 P, \) B
@Override
6 m, i5 I2 N5 l) ]% `
public void exe() {
% A6 A% u" [/ P/ Z2 G3 u% U9 M
receiver.action();
* a# v( H- N1 X# k) e
}
1 c6 L7 o- W& r0 C" e& _9 ~! H- r
}
* R3 y2 i6 q2 k/ v7 g8 Z* T
public class Receiver {
6 S3 V% K j, i7 ~ F
public void action(){
9 g; U- \* c1 G2 [, h7 G( N
System.out.println("command received!");
N4 f! a+ f4 l# h! S4 H
}
' `+ p: U4 Y9 w* i7 D
}
6 p( I' C5 ] C) O) i, ]- i
public class Invoker {
! u6 _ T% C- w6 i' t% Q+ Q$ B
7 E( T- ~: D( k# t- E! `
private Command command;
0 H9 k& ?9 k. T( {0 x
" i3 l) j/ B. D; w2 T1 x
public Invoker(Command command) {
5 B+ n- D7 }9 u; \4 y6 z
this.command = command;
- }/ R* F" I" u9 U6 y" [
}
- s/ a" M5 Y1 K
?3 q1 }& I4 [+ J7 r4 E4 L1 V
public void action(){
1 }1 Y: Q3 v) j# o* u
command.exe();
* s1 p4 |2 q* @2 ~7 T9 c- V$ f$ Z
}
' C. X7 c0 t! ^
}
# q6 Y( {) H3 c m* j8 X
public class Test {
& Q: X5 l9 V1 I- |- M1 c0 G. R
& ^9 G @* |# r5 r3 x& {$ g! |
public static void main(String[] args) {
: H$ R& I" d# o; Y+ m6 R
Receiver receiver = new Receiver();
4 w5 h: S& ~2 `( |
Command cmd = new MyCommand(receiver);
- [/ ]+ Y; ?2 B& }
Invoker invoker = new Invoker(cmd);
4 w- t& R) s6 @0 h3 ]9 |; m1 N$ F8 [0 i
invoker.action();
$ t0 ^; U, d% s
}
) A% ^& ~: O! O! V* l) \& N. v* k
}
: a' @, x0 x( ^, G+ q5 X
\) D0 u8 l$ [1 C
+ P& l' I, \* }$ {! h, s
这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!
7 U4 P1 w/ ?1 g4 b7 [7 l; d
/ F3 m z0 s/ C$ T* q0 W% {
介绍
0 d8 c! s5 S( i# Y M% A: ]
意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
( T# B. ]; y' I8 q0 W! A+ V$ A
- x0 i# M, P3 z0 L, Q( _* s, w
主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
+ A3 e/ _$ ^- Q) B d
# v, ~- o& R+ W! A, E5 g k/ W' Y6 a
何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
/ T' j- e5 d R' O7 k; u A1 ?- ?. K+ m" H: O
+ Y2 Q. {6 c' d; t
如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。
+ s) L' C% D2 b/ p* c6 e
i: j) p2 D: F
关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口
' }4 C( B8 _) i" T
4 S: Q( ^% [# p7 r3 [8 j
应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。
7 R4 _- a' M9 o+ E3 z
0 E9 x; D( |3 w+ k" Z8 ^
优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
B4 a9 Z; c$ [; b5 \) m
8 S3 [0 n5 k- w- {$ H+ ^. z+ x( T" F g
缺点:使用命令模式可能会导致某些系统有过多的具体命令类。
' B7 M! c+ Z8 t( Z" C, d! z
& s( }/ C3 @0 r4 O# G1 T
使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。
q+ | T$ J% N4 J$ Y$ F
. v# {9 K! E8 A
注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。
2 I2 |9 i! Z8 i7 _4 Q& l4 w6 X6 }
————————————————
& @+ X8 O5 o5 z" [8 g) p9 p% p5 c
版权声明:本文为CSDN博主「No_Game_No_Life_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
' }. O9 D6 W- x! M0 y6 E3 n
原文链接:https://blog.csdn.net/No_Game_No_Life_/article/details/85989272
6 b) N4 T( b6 |7 a
8 J; e9 F( h& }" g' b( Z. d
9 V2 `9 J5 [& r3 t5 B
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5