- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565560 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174891
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
; U7 y( X3 W, b6 eJava设计模式——命令模式$ L6 l, h; F; V( m. R
0 s# r# U" N) B' m: s, ]/ ^
命令模式" m G7 K6 ~0 ]: L$ q9 m* F
0 \; \% g* v2 R; s/ |' o! `命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:' W" I7 d `: O5 a& p
$ M7 ]* t) n5 o( I1 n, E, jInvoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码:+ v' J% b% R) a4 A
7 ^6 J& ?. d* y7 L- Mpublic interface Command {
8 S# ?! A/ H8 A public void exe();
1 Z0 P3 G, G, P} 7 `! N8 r% a' }# X
public class MyCommand implements Command {
7 X/ X# L0 A" U: l4 F3 f/ I8 f4 ~7 m+ ^, A- l8 B e7 \, V
private Receiver receiver; . Q' H5 q) a* `4 Z7 l$ Z6 X& N5 S
0 o* U0 M& v4 ~8 L' b D public MyCommand(Receiver receiver) { 6 P% U1 U) W/ Z9 C4 ~- a
this.receiver = receiver; ( ~9 E0 C* F4 P ^# r$ n; P7 i
}
+ ~; M0 P4 i* e$ u
9 H/ a# J0 E, [* Q @Override 1 h1 W* Z7 |) r0 @6 `( ^- ^4 T% t7 x
public void exe() {
& f, d K. j! F! F0 `: d, b& P- u receiver.action(); 6 q/ N6 @0 J6 J7 d2 F) x$ w. J
} % X6 ?1 T) j8 Z' h( E7 ~" q5 k7 _
}
* P2 s$ F1 B* y) s1 jpublic class Receiver { ! e5 b3 C- m! t/ w0 L6 ^
public void action(){ 2 A& x9 V" s4 X j! }* J8 k
System.out.println("command received!");
& N& v9 T7 N8 J }
! b; g+ I! x$ W4 z- m}
$ @. l) ]3 O: R+ k$ rpublic class Invoker { n! i; B$ v1 `' ]8 k
$ T8 J3 L$ u g6 Y
private Command command;
# _/ `' E# L. M0 [" i
6 g& m! k9 x& p3 D6 Y A8 C% e public Invoker(Command command) { / N6 S T4 ^/ f' m9 _
this.command = command;
+ v r0 k6 L/ _- _2 e5 M }
* Q+ O8 E& }* w$ G& g
: ?8 x1 I# G& k0 |/ ~- ], a8 v; K public void action(){ 2 s( X( d7 X6 f6 I& V
command.exe(); 5 a6 v# ?' x( B4 X8 g8 F* S
}
& x& K8 s( w- D3 T: j+ ?}
6 @3 B& I0 V# D5 fpublic class Test { 1 A e( {! R ?
* w/ q L! S) y- [1 g: B
public static void main(String[] args) { # d$ @2 q1 Y. Q& \9 u$ O
Receiver receiver = new Receiver();
* z4 c6 s# A7 {+ M/ d- A& A9 D Command cmd = new MyCommand(receiver); 2 t! L j1 s0 n/ P
Invoker invoker = new Invoker(cmd);
/ x+ Z0 V) [& f$ X4 J" h invoker.action(); & N6 { V/ U& Y g- c
}
% {* p7 }" B# L; }7 ^}
: l' a y& M9 c! {8 G/ @, g* H4 m% a3 F5 {5 J5 F9 T4 T
1 u/ s& s9 V* }3 A这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!: s$ o; h4 b: n" ?
( }5 M1 V1 }! ?' ~4 k5 O; b8 U
介绍) j2 r7 e( x4 j7 W+ b
意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。' g {% \- k G# N
7 x# c* w% G; ~/ b- f" A9 C9 z
主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。/ e }% U8 q% ?6 N1 x
& T3 f6 Q3 q. p0 Z# {; N" ~, M何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
/ Y2 R$ x& d$ O5 J/ b! l- c. P- T, G. S( L
如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。
8 _( ~* Z2 r9 k- g
" ~) X6 v' J8 }/ P关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口9 G# C2 Z4 x& H0 r
; U X- u7 e n2 @7 h$ ^3 v应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。
0 u, w# J* d; T$ H3 A* g. O6 Z+ S
优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。3 y* s }+ t& f3 j4 P/ W' R% \
0 h+ U4 b' G9 y# g8 V, E缺点:使用命令模式可能会导致某些系统有过多的具体命令类。
* h" D% G( Q3 b
4 [( q8 P# {, \使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。
& A8 `8 u! H7 X' n% K9 J! }" g* m( {8 P/ A" P! j; \
注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。" C& a6 V& h+ L( k) L
————————————————
9 R; F, z) U/ s9 y& V0 j版权声明:本文为CSDN博主「No_Game_No_Life_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
! g2 g" O) R( V' X% S" P* o$ L原文链接:https://blog.csdn.net/No_Game_No_Life_/article/details/85989272
9 F3 L v/ P" ^, Y
, m q' e* Z* w. X) Y! j( G5 A$ l; ]
|
zan
|