& u4 ]1 ]5 V$ V! i
Invoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码: , e8 x& h6 f H1 f! T ) W) N% w4 l! `2 Vpublic interface Command { 2 J% r' v& Z9 t" C& s+ u2 S public void exe(); ( ?. o4 P. o) `7 G' k) ^5 X} , Q- m/ O/ B t4 @; B/ c
public class MyCommand implements Command { S3 y. i. u7 e: S1 R6 N
, Z9 a' a7 ?( q, x
private Receiver receiver; / b; \* ]: y8 h2 i1 a1 S: _
# u, d0 D( H8 H4 L4 a0 y$ K
public MyCommand(Receiver receiver) { 6 C# c: @+ |" X8 O3 K
this.receiver = receiver; 2 ~$ u2 s- i: I; U/ y! D% o1 U, }
} 0 H- M. j A3 r$ [& ^6 d% E q% m7 \: E9 `! q: A r
@Override 0 ], {7 z; y" S9 d( W4 A' u2 W0 F
public void exe() { 1 p# T6 X O2 J
receiver.action(); 5 T' _; \4 ~1 N" T& M6 Z+ A } + I, p1 m4 ^" c0 V5 [6 t, G
} 9 i0 Z+ ?/ y/ j: Npublic class Receiver { 5 S; p! W% h+ I8 B public void action(){ # ?6 f W, ?4 v7 Q/ o* j8 p# A System.out.println("command received!"); % d8 C- }- U! L3 t3 t& l) ^0 q
} - ]* d, }) X( U% r' h- e
} 7 C. }' _# {, L% p3 e2 d% Y
public class Invoker { ! t' n$ `9 d8 }5 p9 T7 V* _8 @ 6 B/ o( V# r: L+ k5 e6 c private Command command; ; v! p2 O5 @( o: U% Y
1 N- A' Y' C \5 v
public Invoker(Command command) { 6 f, u( y# D& v/ w9 S
this.command = command; ( \7 o( b, v. M
} h- t7 C2 H# j
; j7 M, ?5 O) j; b$ H$ C: e public void action(){ ; ]& I% C# M! F8 f e
command.exe(); * N8 C# P' i. _) G# G8 Q! z, h
} / e r) y' }1 m. n! Q
} . B' w) C' y: _( @7 O4 P( N. Z
public class Test { % i: Q( `( F% t6 O8 ~) {, G
$ [+ ~) P; Q8 `3 K" M4 n# l* p
public static void main(String[] args) { 7 e2 y0 I4 c- |8 N/ \$ V, p8 M
Receiver receiver = new Receiver(); 1 e I4 S- _3 _# ~! l- w
Command cmd = new MyCommand(receiver); 9 A" b+ [& \! [ G Invoker invoker = new Invoker(cmd); . p Q0 N) b) e invoker.action(); 3 w+ Z7 K: Q, f |# v1 Q } : j) `; ~# h n7 ^, ] u& k$ h} : R/ O) D4 _- s) l/ T7 o* _3 G/ D4 A
2 `+ Z7 D* t: h这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!5 M( b2 h# c8 K3 o7 z
$ l+ [1 I2 O+ ^9 i4 A9 E
介绍 0 G4 E$ f- u7 O: L' R意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。5 B" @ k0 N- X1 |
* [, c; F' h2 [ u5 U
主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。 $ `4 Y9 m# m7 S- k6 E& r3 W% U5 M, c. R* L8 X& s |! p* L( {
何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。. [& Q/ m- ~7 k* E0 d