- 在线时间
- 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年大象老师国赛优 |
8 y8 p$ L( @/ E( u% {2 yJava设计模式——命令模式0 Y; F- y) T0 y
% B& ~/ m* L. f命令模式$ @! V; x+ F6 U L+ D6 M' @
+ R! L; g0 \9 k3 y V6 [4 W. P
命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:0 K% G7 _, E# K; M" D; Q/ K* h
$ q* ~# A% `" {# f4 X& J& aInvoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码:
$ G. p8 Y0 ?* B2 W% G" a
$ }: O' ^; l9 |& i" M! _. C- w$ t' upublic interface Command { P7 I. L$ B, Q6 C3 p% i! C9 F/ R
public void exe(); ; v7 s. F; _: I* p( H
}
; C& l5 d6 O( c7 Gpublic class MyCommand implements Command { / ~) G, Y$ l& b8 Y7 m$ F
; q* z; {6 ~, L! \0 z1 b4 G7 R
private Receiver receiver;
8 J, m( d" n: T7 d( h3 R o0 ?& N) }) Q; P
public MyCommand(Receiver receiver) { , n/ G1 g5 n$ f. y) p; y* E
this.receiver = receiver; 1 o: N# f. H3 L' |5 x4 z
} ) x" j- `1 z: E- e/ ?
% i3 m8 r, ^9 S' N& H! p @Override 0 I/ d( W1 W ^7 p7 }
public void exe() {
4 @4 t, K ]+ C# J' | receiver.action();
1 i. c) G; u* p6 t( [. p } ' z+ {6 _ D+ O7 N
} 9 ^/ O' f" ]0 p% A# e! O
public class Receiver { ; C9 _$ M" S3 R3 L
public void action(){ 1 }6 F' X- {& z* ]
System.out.println("command received!"); : U" a! f3 h, o& _
}
9 Y' I- \; }" ^) H}
2 g- h3 f0 j- K7 b* A8 B" y+ Ypublic class Invoker { 8 F* j) `" o% H+ d8 }0 d, h
6 U: H3 Y: U* p6 t/ {0 ^6 H9 J
private Command command;
f$ O2 E: H! u4 L4 w% r% W6 d4 t6 p: ? L+ t2 l6 B
public Invoker(Command command) {
3 J) K5 u) u B; ?. H% m8 u this.command = command; _3 H5 p; F# y( L; i; ^' A
} , T, j& W9 e$ I3 M+ J* m
7 s1 y8 V& T. T6 y. L public void action(){
?* E/ `) B% ?& a command.exe(); # Q7 b0 a+ X* E/ }
} : c/ u; S p5 @
}
/ Q+ p3 ^8 _: @* X1 L" I9 Zpublic class Test {
, T0 ~% F8 ]# V1 n. a8 j* G4 {/ U: e, B( i
public static void main(String[] args) {
1 H) U6 j+ H+ k9 f Receiver receiver = new Receiver(); , C/ ?: G. V& ^" N! }
Command cmd = new MyCommand(receiver); ! M' ^0 x5 h3 _
Invoker invoker = new Invoker(cmd); . O, w' c; f" E; ~, d4 X& A
invoker.action(); % ]6 P0 F+ `5 H( z/ J6 N
} 3 r* s* k) x/ j$ D* `7 ~
}
: @) n0 Q ]( o6 D! @/ I& q! E, I2 N/ |3 |6 t
5 \9 k3 X/ F% k" b) g这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!
* T; v0 X0 b. @( ]; v; R* h- k; m# V& o8 J) h
介绍6 A) k$ n+ \; M1 G% P( h7 Y9 T
意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。5 U7 R8 J1 Z* M0 w% @" c
: h9 s. m& G/ |( Q4 I主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。4 ^9 R, ]6 Y8 \% U, z
- B8 j) ]. u; }7 |& l n) h9 i
何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
% V5 M. }3 X. Q0 E5 t) j& I+ P0 E) z2 x7 A% D6 O% f) R
如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。, @' B3 Y8 s; x6 _1 Z1 F
) D+ _4 J+ {% t1 T
关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口
' P: m9 \- A; M1 s# {9 r
2 `& R- b& d6 X. v4 K% e0 t' e应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。
; t- ^1 B9 V" P( z8 u8 ^# X% o
9 S( P) X1 M! @& p1 F3 O优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
$ V1 {: z- j$ Y8 v
) |4 z; r, R* Q( B缺点:使用命令模式可能会导致某些系统有过多的具体命令类。
% ~0 y0 R) N8 t: B q8 ~ V1 N3 J% D; j" H9 E- b3 p5 N
使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。
& d3 `/ b& p2 }% J# F- C& f3 n: w4 j# O1 @; D) z4 K8 j" v
注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。6 |. u1 n2 p j% Q0 \
————————————————- M4 U7 q5 D) _+ |: W
版权声明:本文为CSDN博主「No_Game_No_Life_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
. o5 X* {: G, l# B原文链接:https://blog.csdn.net/No_Game_No_Life_/article/details/85989272
# Z( G, X' W' M; m
9 E& r" F, Y$ I6 q$ w, G5 t4 I: ]9 C
|
zan
|