数学建模社区-数学中国

标题: Java设计模式——命令模式 [打印本页]

作者: 杨利霞    时间: 2020-4-24 18:12
标题: Java设计模式——命令模式
# q. N4 |& N2 _
Java设计模式——命令模式- O; F% O. P( d' K' _4 h
# c+ S# E% \, A! l7 e
命令模式5 A6 `1 A' T  t$ ]
& M3 z, f# ]" w* r1 ~4 k
命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:6 h% ]0 M. z# N' b! v6 j. p5 U
9.png 7 _( |6 r5 r* ^" g5 G
Invoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码:
) H- [# ?* o- W1 Y
! @1 ]% a0 w' |7 I9 U9 epublic interface Command {  
$ A2 C* |/ P- B+ ?& V+ y; r    public void exe();  
% G3 t( R- z; p# @; K}  
! Q9 s* K: M, h/ I0 [- e$ p6 Dpublic class MyCommand implements Command {  
$ M8 q4 B9 v# p, R3 m; o6 }) u
8 u% p4 V! F4 @* W1 s    private Receiver receiver;  % z: X, M$ h; y5 t

% K# N9 h& j' X  t    public MyCommand(Receiver receiver) {  
8 J; B* z$ s! }6 Z! Z6 j        this.receiver = receiver;  
0 |6 I) [/ w* l& ]& g$ @0 `: d, P    }  
$ j0 j  `" W* n+ X( O) \
, u' z/ W, k1 ~' g* X+ q    @Override  
  N" n6 J7 u7 ^+ ^+ \) A    public void exe() {  
' I% }0 |0 s$ @! A, }5 C$ p        receiver.action();  ; U, z( Y5 T2 W
    }  9 A' I' ]/ k3 k4 B
}  , `4 b% z! L* \! T  `! [
public class Receiver {  , B; V; s: p5 i. [1 }' Y
    public void action(){  + F' W! w  N* D4 s/ W' m( P- N
        System.out.println("command received!");  
  j- p3 }$ p- N6 M" _2 y    }  
( O5 R( ~1 d! G3 j" m2 u/ y}  
  @% w( `/ Z2 T' l3 O' p/ Apublic class Invoker {  ) {: @$ A/ z+ H4 W

8 j/ B/ @  _6 Q$ I/ l7 [9 T! U1 ]    private Command command;  0 x$ i6 K' R: M( |
* _% s5 [6 h9 X& w/ s8 a5 F1 H
    public Invoker(Command command) {  
0 C7 M+ e3 E! f* X8 \        this.command = command;  % L6 D8 |  U9 |! R; J/ v( T
    }  8 G  P: t7 o6 r! E7 d# u
' ?9 g8 [1 ~+ p& n% U7 U2 }" O
    public void action(){  
& p( i" t& \5 v/ z. L+ z6 y! e        command.exe();  
/ N2 e7 k. \6 K+ V# g9 ?. h    }  ' D3 T  w% _2 \4 `
}  
, m4 B0 P6 [' npublic class Test {  : T& ~4 S# b: C/ a  M. O  c6 F' C2 p

. ^- R) D. r& |' B; y, R# n  q    public static void main(String[] args) {  * b- E: F0 D6 `  d- I7 r9 x# J) r
        Receiver receiver = new Receiver();  
& s, y* H) E# E4 c1 _/ ]6 l" w        Command cmd = new MyCommand(receiver);  % e0 C* ~$ p" V: b
        Invoker invoker = new Invoker(cmd);  
0 _; m1 M. X  e" g; ~8 O        invoker.action();  
# q: |: i) W" \/ T4 b- ?4 p) m    }    Z: O2 `8 I! k
}  ) P' f" C* r* m0 g, d9 ?
* x( |6 N$ G/ g$ |5 c% N0 B$ S$ R
5 C( N* y' |: G
这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!
$ n+ j) z; \# L! ^4 m+ X5 C2 `% [1 t2 a
介绍
) m. h" O: ^* t8 V- T6 k, t意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。) q) ]4 G# \: G9 r0 J; Q
0 c# v7 c2 T' V$ d+ @$ m2 m& F
主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
1 L! A2 _5 }# r$ Q% r3 m6 g; ~3 H% O7 ?6 h
何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。1 h% }) X8 r$ a$ n5 M0 Z8 K& W6 `
: C: g7 }& Y1 m
如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。
( j/ H! D" N1 _2 X. y
. B( _5 l# `" U/ A. A* y5 |; j关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口& v) `$ j+ G; ^

" A4 C- Z# O( o1 k8 M  b1 z2 }4 x3 i应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。! U- z) u( X! o& w# A) y

% Q6 e  v3 m1 m2 k- m" i  M' n优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
% A; e7 ]7 R4 d* b4 x& x7 H5 b
( M3 \, t! R4 z6 h& t缺点:使用命令模式可能会导致某些系统有过多的具体命令类。
* t  {+ d- ?7 z! w- g! m
+ I9 Z6 Y; i. [, _: K: A使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。
: m4 ]! b- C- X' h) ]2 \3 c
0 Z5 J1 Y* X) y# T' C  z# T注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。/ }0 [) J4 n2 Q  O' Q3 X2 d
————————————————
# Z4 D) r3 d# X( X0 J6 C版权声明:本文为CSDN博主「No_Game_No_Life_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。' r) s# V* t1 n* S
原文链接:https://blog.csdn.net/No_Game_No_Life_/article/details/859892728 ~6 Z$ u# a" m! v' N9 ]6 }

  a& A# H) V5 {8 ?' z- V' w
  Q9 _  {9 ^3 o+ O9 n6 }




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5