QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1702|回复: 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

    7 `; B/ G" _; bJava设计模式——命令模式
    ; p1 }+ K4 o0 N. R; K. {7 V; l" ~5 Q! p
    命令模式+ B6 Y( L: Z3 N5 n& x" h
    1 y1 P" K; x/ D
    命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:
    5 R7 ^+ H6 W0 r- C9 ~% F 9.png 4 Y: s1 i) W9 h% @' ^+ W
    Invoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码:
    % s  N6 c& ?5 y6 f
    . Z, ~0 d4 l( k, {- jpublic interface Command {  8 a9 o3 C4 Y- u
        public void exe();  
    9 d% I2 C8 H  F5 g/ G8 Y}  
    % F# s9 d4 }$ \+ wpublic class MyCommand implements Command {  
    , c. e$ f, W* ?) o
      @& ]" C% {- P' _    private Receiver receiver;  
    " x/ t( y3 W8 w4 B
    # S; X5 z" s; B" m$ P    public MyCommand(Receiver receiver) {  1 P, {2 y% m; Z# F
            this.receiver = receiver;  
    ' {; [0 m/ m- ?5 H    }  / R2 u, o( P8 ?

    0 R% \" f1 Y* ]8 o3 u    @Override  
    # l5 p' Y+ v+ W3 }2 N- E( V    public void exe() {  $ @3 f2 ^% w. a6 A6 N% a% p% n
            receiver.action();  
    6 C4 m  B3 D0 S' O. R; N    }  
    5 ]5 x6 D. o* E# f+ d& U}  
    2 I  w0 q$ p9 Npublic class Receiver {  
      t' i7 m! s/ C" N# Q    public void action(){  - Z" Q. `% ~4 H8 [2 g
            System.out.println("command received!");  
      \" [4 H9 J6 Y: w* E    }  5 K; S& d2 {1 U6 _' v* G0 o
    }  0 J5 |" B; m# B3 A) V* {3 Z
    public class Invoker {  
    / L5 o& |" E" f" }5 F( a' K" T9 r2 k1 `- z9 l
        private Command command;  % L" ^- j. R. ^, C/ [2 O: z3 l

    # W+ f5 R' H2 J' p" d    public Invoker(Command command) {  # D5 v& X" W: f- ]2 a
            this.command = command;  7 W5 V1 K, B% C/ R/ N  B3 B0 ]& D
        }  
    4 H$ X5 `1 r: ~
      [% A" x, k2 N3 C- i2 ]- Y) V    public void action(){  
    5 [5 x) l4 B# }0 l3 s7 Z        command.exe();  
    ( ~/ r8 e- k* Q) ~9 `& ]0 I1 k    }  
    , ^8 r( r8 K9 w0 I; I, b4 i}  
    ! `/ d6 W: ~+ cpublic class Test {  
    , W3 `: r/ M% ^/ n6 F0 \) ^5 @2 z. [4 P& G. u6 k  C
        public static void main(String[] args) {  $ c5 o* d3 r5 E8 c
            Receiver receiver = new Receiver();  
    3 K) o  J8 m% e3 \: _        Command cmd = new MyCommand(receiver);  
    3 P% R$ M& @7 R+ G2 @        Invoker invoker = new Invoker(cmd);  
    & r/ \6 ?/ O* |8 j$ K        invoker.action();  
    / e  A9 {& l3 n# {) U' ]+ A  m    }  
    " h* Y' [1 ~/ n}  
    % @* d; h& ~3 o% W4 x6 U2 ~
    6 J! H6 E2 Z7 W$ }' L) ]8 a5 w$ Q1 x8 G8 k9 u
    这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!* X; ]- N7 u6 G+ B
    ' l) [& Z! U3 |; ?
    介绍
    / \5 w# d, ?4 B0 x意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
    9 I1 ?$ |; z6 `: X1 x) T& l/ Z1 z! u% x. d9 h% {
    主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
    : b* c9 P" _6 `$ l( g& u5 e7 E+ P
    何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。1 ^) _( C' Y) m* z- O3 e+ j
    ) O4 {: D4 W0 s% i1 b8 [
    如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。
    2 n) z' y$ l" V4 ^, C. H3 H
    / |/ S. N6 K' j关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口
    1 q' ?! R( A$ ~- |# H
    , L- P- b' A  r/ Y; r; ]应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。
    - h) V6 T0 ?3 |$ c5 c& H3 {6 D5 p" h& v
    / g# z$ `3 \0 I+ F' y  S1 `优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。9 c" R5 l0 V  ]% S3 o
    : F, K' `3 C9 N$ l; |& y0 n
    缺点:使用命令模式可能会导致某些系统有过多的具体命令类。7 `$ U, K! D: R: f% \# c& M& W
    0 f, D# y" S9 i; W
    使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。
    * C4 w& [) ?) f9 C% I; n% }+ e: j8 W! D' ]1 {
    注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。
    : O% Z# f. l6 d% \3 H$ ^————————————————1 l' ~9 F7 ]3 e; x& _% X
    版权声明:本文为CSDN博主「No_Game_No_Life_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。0 F: g8 A) T' \- v/ g/ @& |
    原文链接:https://blog.csdn.net/No_Game_No_Life_/article/details/85989272
    ) l9 H% ]3 Z. t9 }) E# S4 y2 u/ Y4 C! R7 }) x2 p  I+ \/ W
    8 B( w; E0 ^, D" `0 ?
    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-6-9 20:25 , Processed in 0.396138 second(s), 54 queries .

    回顶部