QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1715|回复: 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
    " M. C4 k* H9 N. M* g+ X0 V5 s8 M1 B
    Java设计模式——命令模式  ?7 v3 W/ K4 m, g5 i

    % K7 d1 k( u8 }/ j' m命令模式; Y9 H3 ?: F# D% n/ C
    7 @; H! j: [; \# ?! w/ @4 R
    命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:! c  q2 Q7 V# D( V7 m/ x/ t
    9.png & 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

    0 s% l+ F0 `- O- ]0 W4 I如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。
    + E" h9 v# a9 @3 X0 L
    $ e5 e1 A7 d7 p7 s' K: H关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口/ A* T& X- f! v' t4 y$ i

      K* K6 \  z" v6 Q应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。; O2 e8 Y+ ~* P2 q4 t3 M

    3 K* E; o. \. x8 O' s9 ?: l# K优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
    ' Q. F) x; W( \5 \
    8 i0 I9 G% F( B& O* F. d5 s缺点:使用命令模式可能会导致某些系统有过多的具体命令类。
    % B7 e" q# |5 u! T# a
    ( p) C7 v. M3 N% }4 Q" F. K使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。
    3 G, K  O2 n: I. ?, ^+ b& ~7 l- g) N: x. |! s5 @
    注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。
    + S! h% q0 n" V* w————————————————
    " `8 E  W0 F0 q9 ^6 M- v* C版权声明:本文为CSDN博主「No_Game_No_Life_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    % _6 V9 f; f6 m  a原文链接:https://blog.csdn.net/No_Game_No_Life_/article/details/85989272
    ; B5 `% L  n! n1 A+ Z- a
    5 a4 R: j- e: c8 D: Y& \' p- R8 f' E4 U! c) S/ 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-7-26 07:36 , Processed in 0.385735 second(s), 54 queries .

    回顶部