QQ登录

只需要一步,快速开始

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

    8 y8 p$ L( @/ E( u% {2 yJava设计模式——命令模式0 Y; F- y) T0 y

    % B& ~/ m* L. f命令模式$ @! V; x+ F6 U  L+ D6 M' @
    + R! L; g0 \9 k3 y  V6 [4 W. P
    命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:0 K% G7 _, E# K; M" D; Q/ K* h
    9.png
    $ q* ~# A% `" {# f4 X& J& aInvoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码:
    $ G. p8 Y0 ?* B2 W% G" a
    $ }: O' ^; l9 |& i" M! _. C- w$ t' upublic interface Command {    P7 I. L$ B, Q6 C3 p% i! C9 F/ R
        public void exe();  ; v7 s. F; _: I* p( H
    }  
    ; C& l5 d6 O( c7 Gpublic class MyCommand implements Command {  / ~) G, Y$ l& b8 Y7 m$ F
    ; q* z; {6 ~, L! \0 z1 b4 G7 R
        private Receiver receiver;  
    8 J, m( d" n: T7 d( h3 R  o0 ?& N) }) Q; P
        public MyCommand(Receiver receiver) {  , n/ G1 g5 n$ f. y) p; y* E
            this.receiver = receiver;  1 o: N# f. H3 L' |5 x4 z
        }  ) x" j- `1 z: E- e/ ?

    % i3 m8 r, ^9 S' N& H! p    @Override  0 I/ d( W1 W  ^7 p7 }
        public void exe() {  
    4 @4 t, K  ]+ C# J' |        receiver.action();  
    1 i. c) G; u* p6 t( [. p    }  ' z+ {6 _  D+ O7 N
    }  9 ^/ O' f" ]0 p% A# e! O
    public class Receiver {  ; C9 _$ M" S3 R3 L
        public void action(){  1 }6 F' X- {& z* ]
            System.out.println("command received!");  : U" a! f3 h, o& _
        }  
    9 Y' I- \; }" ^) H}  
    2 g- h3 f0 j- K7 b* A8 B" y+ Ypublic class Invoker {  8 F* j) `" o% H+ d8 }0 d, h
    6 U: H3 Y: U* p6 t/ {0 ^6 H9 J
        private Command command;  
      f$ O2 E: H! u4 L4 w% r% W6 d4 t6 p: ?  L+ t2 l6 B
        public Invoker(Command command) {  
    3 J) K5 u) u  B; ?. H% m8 u        this.command = command;    _3 H5 p; F# y( L; i; ^' A
        }  , T, j& W9 e$ I3 M+ J* m

    7 s1 y8 V& T. T6 y. L    public void action(){  
      ?* E/ `) B% ?& a        command.exe();  # Q7 b0 a+ X* E/ }
        }  : c/ u; S  p5 @
    }  
    / Q+ p3 ^8 _: @* X1 L" I9 Zpublic class Test {  
    , T0 ~% F8 ]# V1 n. a8 j* G4 {/ U: e, B( i
        public static void main(String[] args) {  
    1 H) U6 j+ H+ k9 f        Receiver receiver = new Receiver();  , C/ ?: G. V& ^" N! }
            Command cmd = new MyCommand(receiver);  ! M' ^0 x5 h3 _
            Invoker invoker = new Invoker(cmd);  . O, w' c; f" E; ~, d4 X& A
            invoker.action();  % ]6 P0 F+ `5 H( z/ J6 N
        }  3 r* s* k) x/ j$ D* `7 ~
    }  
    : @) n0 Q  ]( o6 D! @/ I& q! E, I2 N/ |3 |6 t

    5 \9 k3 X/ F% k" b) g这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!
    * T; v0 X0 b. @( ]; v; R* h- k; m# V& o8 J) h
    介绍6 A) k$ n+ \; M1 G% P( h7 Y9 T
    意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。5 U7 R8 J1 Z* M0 w% @" c

    : h9 s. m& G/ |( Q4 I主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。4 ^9 R, ]6 Y8 \% U, z
    - B8 j) ]. u; }7 |& l  n) h9 i
    何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
    % V5 M. }3 X. Q0 E5 t) j& I+ P0 E) z2 x7 A% D6 O% f) R
    如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。, @' B3 Y8 s; x6 _1 Z1 F
    ) D+ _4 J+ {% t1 T
    关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口
    ' P: m9 \- A; M1 s# {9 r
    2 `& R- b& d6 X. v4 K% e0 t' e应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。
    ; t- ^1 B9 V" P( z8 u8 ^# X% o
    9 S( P) X1 M! @& p1 F3 O优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
    $ V1 {: z- j$ Y8 v
    ) |4 z; r, R* Q( B缺点:使用命令模式可能会导致某些系统有过多的具体命令类。
    % ~0 y0 R) N8 t: B  q8 ~  V1 N3 J% D; j" H9 E- b3 p5 N
    使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。
    & d3 `/ b& p2 }% J# F- C& f3 n: w4 j# O1 @; D) z4 K8 j" v
    注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。6 |. u1 n2 p  j% Q0 \
    ————————————————- M4 U7 q5 D) _+ |: W
    版权声明:本文为CSDN博主「No_Game_No_Life_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    . o5 X* {: G, l# B原文链接:https://blog.csdn.net/No_Game_No_Life_/article/details/85989272
    # Z( G, X' W' M; m
    9 E& r" F, Y$ I6 q$ w, G5 t4 I: ]9 C
    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 18:56 , Processed in 0.490670 second(s), 53 queries .

    回顶部