回答

收藏

Java设计模式【命令模式】

知识点 知识点 176 人阅读 | 0 人回复 | 2021-12-09

Java设计模式0 u& h0 Y, T7 r5 A2 e
命令模式
2 o/ x, _/ E! [  L* b9 l命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:
4 w4 U9 s" I) }+ \* ^' gInvoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码:+ t+ ]% a- P8 P% h
  1. public interface Command {   8 a3 S& L, c+ y/ f1 [
  2.     public void exe();   $ z8 Q5 `. C6 \4 i
  3. }  
  4. public class MyCommand implements Command {  
  5.    1 M- k# A5 `# h: r; k$ e
  6.     private Receiver receiver;  
  7.        ! ~0 d+ x. u4 p
  8.     public MyCommand(Receiver receiver) {   - Q( r0 N0 X" l! b. P
  9.         this.receiver = receiver;  
  10.     }   0 P4 F" `; d& Z2 o& D! _
  11.    $ R7 \4 ~' K/ K
  12.     @Override   . N, i' e) n- k, Z& n3 u" q
  13.     public void exe() {  
  14.         receiver.action();  
  15.     }  
  16. }   $ g. E( I) i) K) k1 I/ s
  17. public class Receiver {  
  18.     public void action(){  
  19.         System.out.println("command received!");  
  20.     }   & ]5 I. I3 R2 V( W) f) }
  21. }  
  22. public class Invoker {  
  23.        4 o+ i$ a# z. `* z$ f8 ~% K' |0 X9 I
  24.     private Command command;  
  25.       
  26.     public Invoker(Command command) {  
  27.         this.command = command;   ) G. `5 ~* y# c3 a3 {! c
  28.     }   7 ^- f! ~; ]- P# F1 f7 P1 n) R9 V; N
  29.    8 n8 U! P0 f' {' P) s  f; o
  30.     public void action(){   ! o- i, R$ h1 m" M( s" p# E/ b
  31.         command.exe();   ' [. |$ k+ \* w! P! L5 J& A! p! B
  32.     }   , a# K0 t2 R  e5 Z& @% K! i
  33. }  
  34. public class Test {   7 q. G  r. s' s& d! U$ {; Y# w
  35.    
  36.     //java项目www.fhadmin.org ! y4 z# {, c1 y6 J
  37.     public static void main(String[] args) {   ' l, K, E4 C5 U7 A2 _
  38.         Receiver receiver = new Receiver();   ) o, s  w7 O9 Q
  39.         Command cmd = new MyCommand(receiver);  
  40.         Invoker invoker = new Invoker(cmd);  
  41.         invoker.action();   / t7 f( K' t# I  i
  42.     }  
  43. }  
复制代码
  
) C- _7 y0 O+ I/ E1 X
  1. <img src="https://www.cnblogs.com/data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==" width="15" height="15"  title="点击并拖拽以移动"  data-cke-widget-drag-handler="1">
复制代码
这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!
7 L- g. u4 o( k; S: ~介绍
1 l, n# f" r5 k5 {2 ^$ S意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
1 N$ f9 \) b6 ]( s) v主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
1 ]- a' x5 u; O& H何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
6 C( u. G( K1 L/ W2 C1 b9 |如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。
$ H2 O: O+ z/ g: J关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口0 W5 s1 B) e1 s: Z+ `
应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。) f$ A8 M$ ]% D0 d' `8 \, x0 j' X
优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
. V) g1 b2 ]* e' `缺点:使用命令模式可能会导致某些系统有过多的具体命令类。; S" _, z1 |: j+ D" k1 H8 P* o) o
使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。8 B; _$ K. ?1 ?) r! ~( n* M7 O
注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。
' M/ c( Z1 c% i9 U4 x3 \( c/ t
0 S" J6 C0 {3 p$ S5 c2 O  h% UJava吧(Java8.com)后续还会分享更多java技术文章、资源,希望大家以后多多支持Java吧 www.java8.com
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

316 积分
60 主题
热门推荐