- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565565 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174892
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
& L: H8 X' y0 T5 T6 Q* o# z0 n0 L
Java设计模式——命令模式+ [+ U. {+ v1 F7 b9 I* k$ K
2 N5 a! K9 v- o% h; Y' d" x+ N命令模式
: \/ G! A+ f* a% i& l& M% _! F4 U% I9 F' L" f+ O. L. ^' f$ [
命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:
+ _6 j/ o3 J: j4 q& ?. ^
+ f3 i7 S" j+ H7 J9 V$ x
Invoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码:2 \( y9 n7 k# b0 o7 x
9 `6 J, `2 \; l; t- f1 spublic interface Command { * j2 t# K/ |$ ~( X8 A- J
public void exe(); 4 H/ R# m+ x) P* h
} 1 B" v4 L% Y/ [6 o% p
public class MyCommand implements Command { E5 b" I6 x: r6 U
" h; l7 I4 e( k: {4 ~2 X. C; ^
private Receiver receiver;
9 k. Q; Q. A0 X3 K. Q8 v; n) K- O9 q2 g
public MyCommand(Receiver receiver) {
8 J5 q% c b3 y! @ this.receiver = receiver; 2 c9 W! _4 w: |
} % |# E F9 Y/ n& o
) ~3 b) k* Y0 I8 a% u. a; _( | @Override 3 C9 X7 q! ~8 j0 }0 E1 d& a
public void exe() {
! L) k4 {+ X6 f! g4 p receiver.action();
, p. S1 S* x o0 |/ L }
+ c+ L/ G% f: N K5 Q1 s}
2 R+ Y5 P( Q) b% ?5 I4 |public class Receiver {
% N0 ]0 G7 M' {) W0 C2 l' `% T public void action(){
5 o* _, U1 n& g' ]+ u7 M1 x' P0 J5 a System.out.println("command received!");
e$ u4 M- m# T. S }
9 [: ]4 x9 F7 _, [9 H6 `} 9 _% x1 o9 ?/ m ^
public class Invoker {
" j9 P" A# P' `( }$ N. J6 o% R6 \- v) t2 c/ o9 T
private Command command;
, g( `" P7 W2 _* p: X/ k' q( m Z6 E2 O/ g8 @1 H
public Invoker(Command command) { ) A9 U @: C2 e9 m
this.command = command;
% }- F6 x f% E9 `, @ } 4 R; }. l$ H3 t
( y- X' t- p. W1 ]" v public void action(){ 8 j* d1 y" n3 s# |
command.exe(); 0 {9 y! _( z0 v0 ^0 x D8 d
} $ g; j: A3 W/ C5 ]! c
}
$ w$ {8 H: ?2 y+ ^# @public class Test {
2 { e# b) x: d- I! y: L. H g5 c V4 r) i" C2 u \
public static void main(String[] args) {
7 e4 m; X% u; z Receiver receiver = new Receiver(); $ ?* s i; E: F6 F& p% i
Command cmd = new MyCommand(receiver); & b- }- e$ M% m: Y7 a7 U
Invoker invoker = new Invoker(cmd);
?- F) w u( f* k invoker.action();
3 x2 q6 ]5 [5 |0 d: F }
* r1 u- \: j& J% o2 Y* e} * B9 F G. J |, Z
& R. e6 q* y1 o% a& J
+ P/ v$ W; Y i% U- {
这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!% T! Q1 A* ^: v! y/ q
: d) W* X; a$ L
介绍
/ _$ O5 m* v- F# @1 E$ e意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。' G2 F) _9 G6 ~9 A2 o
6 a2 M' U; ]5 R% g3 p0 @& S2 |
主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。; t0 c" R1 @! o5 K/ A. W
5 d! t# m7 T3 r5 ~: I" K% e
何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
% @/ o' K7 l: \, ? g
, b2 v4 Y' h3 {0 K, q+ z6 E如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。; {: T/ E9 S9 z- S7 t/ X
; ]/ K' S4 r$ V! p% F( i3 {关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口3 B- u& U) s+ Z( X N0 X2 q
2 T5 w0 J! \& ?/ W( K% K应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。
* S% A, j: m1 ~ C- j G3 U$ K/ Q# Y5 w0 N/ _2 v8 q$ C$ E1 ~
优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。+ o% i# ~' a8 i3 L0 u
# _% D9 V; l5 }0 j0 _. |2 _缺点:使用命令模式可能会导致某些系统有过多的具体命令类。1 ~- ^+ S. F" G# P1 p, }- ~# L
# O: U5 |& M- M { h使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。
5 f4 k ~4 D |. i/ W5 Q
! y, n0 t3 \- C+ X$ O7 ^+ j$ C注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。: y+ D9 | Y y& ?* w4 D
————————————————2 }2 S8 b" `" [( h* G9 Z& K: C
版权声明:本文为CSDN博主「No_Game_No_Life_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。! V6 N' U6 ]$ j1 x. U6 ~% D2 q
原文链接:https://blog.csdn.net/No_Game_No_Life_/article/details/85989272
; ^1 h) i! _2 h/ r/ s* _ u. l; X+ _% |/ j" D2 ]- s' s
" E2 ]3 \, h$ R' a/ V+ K& U
|
zan
|