QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1732|回复: 0
打印 上一主题 下一主题

Java设计模式——命令模式

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-4-24 18:12 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    / `! 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.png
    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
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-9-10 08:38 , Processed in 2.198555 second(s), 53 queries .

    回顶部