- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566871 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175284
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
/ `! K" n& A0 w5 ?' X4 \
Java设计模式——命令模式# S9 F( [7 P/ L) F7 ]
0 F+ y6 A$ b: N% k" {( u命令模式3 l8 N! i8 e. F+ f0 ?
9 U0 @0 i5 F& z' @: V8 \命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:. P+ b8 t2 A: {& h1 D: b
9 l3 \0 F5 G( I1 vInvoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码:
& k- a+ V6 x& y0 R$ q- m x* @ d5 f$ ~) {+ ?
public interface Command { + a& ~9 N% Q* }5 g
public void exe();
1 L/ Y8 G7 X& z5 l* U. v+ S1 Y}
2 M6 X) O; z8 H* Mpublic class MyCommand implements Command { 4 f8 v/ P- y* d& E
3 v |+ h1 [ d( G6 q/ z; V private Receiver receiver; : Q& y) r" k+ @4 o0 E( p
- C4 K' V7 p7 }1 Y4 I4 f4 p% h9 k/ R& c
public MyCommand(Receiver receiver) {
9 y; @5 A7 s: A( S4 h6 k2 N% o. J this.receiver = receiver;
% h$ R) W- s0 U7 C- `0 Q w' ^ } $ C7 G! J/ G0 o- O& w
! `! G5 n. S2 z; _& ] @Override + A$ S- O0 v! q- ^' K
public void exe() {
0 l% r# r. ?( V) k" r receiver.action();
3 D2 q' Z, q" g }
) U; M& I- @: @& C( N}
, a* n& s o3 S6 D; qpublic class Receiver { * t) k$ e$ r* f; a2 G/ Z
public void action(){ " A+ @# M) H+ P o& U% g8 B
System.out.println("command received!"); " V1 `$ Y# N. _
}
/ ]! ?% y* ^) K) C q: ^} " T, e* A5 l& W0 O
public class Invoker {
8 I |2 v& z7 q$ v- W
* C- U" y9 v, F* z+ o8 z private Command command; % G1 s* @3 A2 ^
. M) v- B8 H, `, g1 ]) J3 `. q
public Invoker(Command command) {
) Z- ~9 m3 d K# I+ B this.command = command; 6 c+ L9 N8 `: J1 c* S# X& b
}
* R' l/ f4 c8 Z" E: }! C5 w$ d6 p4 ]: m2 m. J& {
public void action(){ $ E) n; j' J7 T( ^
command.exe();
( O8 b. u. b& k1 T; |" _ G* X7 O } * q: P% Q* n" t- S# X1 ^" c
}
1 w" r" G6 u" y( V* @public class Test { 6 K0 b# @; W4 C* V! _/ A5 U; x
; Y( g1 z$ q5 M( D; ^8 p public static void main(String[] args) {
- C0 Z, l$ _* I9 _: a5 b9 J Receiver receiver = new Receiver(); , ?9 `# h; `& G% x
Command cmd = new MyCommand(receiver);
% q/ R% i2 K: K8 h: z Invoker invoker = new Invoker(cmd);
4 ?7 L" W0 A8 F& q4 Q5 U invoker.action();
7 h' C9 v# `% u; b }
1 R/ t7 Y" C" H. @+ K}
; G7 a, j9 i4 p0 p4 D. D
9 q# U/ G. ~/ E1 m3 F. @7 |% G7 I8 [7 c- Q) g; h8 W
这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!! k) L: J+ Y6 k, p7 S
( V0 Y/ G( I$ B l介绍
; x$ m( K( ~7 e0 t9 r意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。6 K$ b4 o7 V8 G" W- B
\; L% T2 s0 H9 F* ]2 N- {2 A主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
$ K/ ^ j- K$ @" ~% _( E+ ~
) F# u. M3 v. p' T) A, X9 }4 ]8 a何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。. ?$ {) n$ y$ ] ^
1 K- {; H, k! l/ e* P& i; D如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。9 q, i" X0 L) ?* \
( ]% |* Z) z, B: X2 B1 f
关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口2 a6 c; B/ Q8 x) ]
5 z W \+ j1 M, v7 K6 m; k7 ]2 o' x
应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。# B% n* e4 G) K. Z" r
2 ~- X: f9 ]/ o, n
优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
' X% Z' ^/ i2 R9 B, v" K
; M- }. A1 n- d2 s+ g( N6 s缺点:使用命令模式可能会导致某些系统有过多的具体命令类。, o3 `4 {) }6 K# ]
7 N* ]9 ]" T( t$ p使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。
0 y& w% q3 ^+ }8 C( n$ ]% N
. N0 q& n; C m$ }- l. Q* ]$ {注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。/ E4 A. |8 V) S+ u" D& F9 e
————————————————. G+ b& t6 g8 C' K! {0 n: i
版权声明:本文为CSDN博主「No_Game_No_Life_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* b- E+ e: b7 K
原文链接:https://blog.csdn.net/No_Game_No_Life_/article/details/85989272* f5 v3 y8 M6 n* l1 l$ `# x+ X
% b* J" \, K' m3 b' ^/ v) l* i
3 q* |/ J- H( R; v3 y1 e; o |
zan
|