- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564647 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174617
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
7 `; B/ G" _; bJava设计模式——命令模式
; p1 }+ K4 o0 N. R; K. {7 V; l" ~5 Q! p
命令模式+ B6 Y( L: Z3 N5 n& x" h
1 y1 P" K; x/ D
命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:
5 R7 ^+ H6 W0 r- C9 ~% F
4 Y: s1 i) W9 h% @' ^+ W
Invoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码:
% s N6 c& ?5 y6 f
. Z, ~0 d4 l( k, {- jpublic interface Command { 8 a9 o3 C4 Y- u
public void exe();
9 d% I2 C8 H F5 g/ G8 Y}
% F# s9 d4 }$ \+ wpublic class MyCommand implements Command {
, c. e$ f, W* ?) o
@& ]" C% {- P' _ private Receiver receiver;
" x/ t( y3 W8 w4 B
# S; X5 z" s; B" m$ P public MyCommand(Receiver receiver) { 1 P, {2 y% m; Z# F
this.receiver = receiver;
' {; [0 m/ m- ?5 H } / R2 u, o( P8 ?
0 R% \" f1 Y* ]8 o3 u @Override
# l5 p' Y+ v+ W3 }2 N- E( V public void exe() { $ @3 f2 ^% w. a6 A6 N% a% p% n
receiver.action();
6 C4 m B3 D0 S' O. R; N }
5 ]5 x6 D. o* E# f+ d& U}
2 I w0 q$ p9 Npublic class Receiver {
t' i7 m! s/ C" N# Q public void action(){ - Z" Q. `% ~4 H8 [2 g
System.out.println("command received!");
\" [4 H9 J6 Y: w* E } 5 K; S& d2 {1 U6 _' v* G0 o
} 0 J5 |" B; m# B3 A) V* {3 Z
public class Invoker {
/ L5 o& |" E" f" }5 F( a' K" T9 r2 k1 `- z9 l
private Command command; % L" ^- j. R. ^, C/ [2 O: z3 l
# W+ f5 R' H2 J' p" d public Invoker(Command command) { # D5 v& X" W: f- ]2 a
this.command = command; 7 W5 V1 K, B% C/ R/ N B3 B0 ]& D
}
4 H$ X5 `1 r: ~
[% A" x, k2 N3 C- i2 ]- Y) V public void action(){
5 [5 x) l4 B# }0 l3 s7 Z command.exe();
( ~/ r8 e- k* Q) ~9 `& ]0 I1 k }
, ^8 r( r8 K9 w0 I; I, b4 i}
! `/ d6 W: ~+ cpublic class Test {
, W3 `: r/ M% ^/ n6 F0 \) ^5 @2 z. [4 P& G. u6 k C
public static void main(String[] args) { $ c5 o* d3 r5 E8 c
Receiver receiver = new Receiver();
3 K) o J8 m% e3 \: _ Command cmd = new MyCommand(receiver);
3 P% R$ M& @7 R+ G2 @ Invoker invoker = new Invoker(cmd);
& r/ \6 ?/ O* |8 j$ K invoker.action();
/ e A9 {& l3 n# {) U' ]+ A m }
" h* Y' [1 ~/ n}
% @* d; h& ~3 o% W4 x6 U2 ~
6 J! H6 E2 Z7 W$ }' L) ]8 a5 w$ Q1 x8 G8 k9 u
这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!* X; ]- N7 u6 G+ B
' l) [& Z! U3 |; ?
介绍
/ \5 w# d, ?4 B0 x意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
9 I1 ?$ |; z6 `: X1 x) T& l/ Z1 z! u% x. d9 h% {
主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
: b* c9 P" _6 `$ l( g& u5 e7 E+ P
何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。1 ^) _( C' Y) m* z- O3 e+ j
) O4 {: D4 W0 s% i1 b8 [
如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。
2 n) z' y$ l" V4 ^, C. H3 H
/ |/ S. N6 K' j关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口
1 q' ?! R( A$ ~- |# H
, L- P- b' A r/ Y; r; ]应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。
- h) V6 T0 ?3 |$ c5 c& H3 {6 D5 p" h& v
/ g# z$ `3 \0 I+ F' y S1 `优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。9 c" R5 l0 V ]% S3 o
: F, K' `3 C9 N$ l; |& y0 n
缺点:使用命令模式可能会导致某些系统有过多的具体命令类。7 `$ U, K! D: R: f% \# c& M& W
0 f, D# y" S9 i; W
使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。
* C4 w& [) ?) f9 C% I; n% }+ e: j8 W! D' ]1 {
注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。
: O% Z# f. l6 d% \3 H$ ^————————————————1 l' ~9 F7 ]3 e; x& _% X
版权声明:本文为CSDN博主「No_Game_No_Life_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。0 F: g8 A) T' \- v/ g/ @& |
原文链接:https://blog.csdn.net/No_Game_No_Life_/article/details/85989272
) l9 H% ]3 Z. t9 }) E# S4 y2 u/ Y4 C! R7 }) x2 p I+ \/ W
8 B( w; E0 ^, D" `0 ?
|
zan
|