QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1717|回复: 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
    & L: H8 X' y0 T5 T6 Q* o# z0 n0 L
    Java设计模式——命令模式+ [+ U. {+ v1 F7 b9 I* k$ K

    2 N5 a! K9 v- o% h; Y' d" x+ N命令模式
    : \/ G! A+ f* a% i& l& M% _! F4 U% I9 F' L" f+ O. L. ^' f$ [
    命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:
    + _6 j/ o3 J: j4 q& ?. ^ 9.png + f3 i7 S" j+ H7 J9 V$ x
    Invoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码:2 \( y9 n7 k# b0 o7 x

    9 `6 J, `2 \; l; t- f1 spublic interface Command {  * j2 t# K/ |$ ~( X8 A- J
        public void exe();  4 H/ R# m+ x) P* h
    }  1 B" v4 L% Y/ [6 o% p
    public class MyCommand implements Command {    E5 b" I6 x: r6 U
    " h; l7 I4 e( k: {4 ~2 X. C; ^
        private Receiver receiver;  
    9 k. Q; Q. A0 X3 K. Q8 v; n) K- O9 q2 g
        public MyCommand(Receiver receiver) {  
    8 J5 q% c  b3 y! @        this.receiver = receiver;  2 c9 W! _4 w: |
        }  % |# E  F9 Y/ n& o

    ) ~3 b) k* Y0 I8 a% u. a; _( |    @Override  3 C9 X7 q! ~8 j0 }0 E1 d& a
        public void exe() {  
    ! L) k4 {+ X6 f! g4 p        receiver.action();  
    , p. S1 S* x  o0 |/ L    }  
    + c+ L/ G% f: N  K5 Q1 s}  
    2 R+ Y5 P( Q) b% ?5 I4 |public class Receiver {  
    % N0 ]0 G7 M' {) W0 C2 l' `% T    public void action(){  
    5 o* _, U1 n& g' ]+ u7 M1 x' P0 J5 a        System.out.println("command received!");  
      e$ u4 M- m# T. S    }  
    9 [: ]4 x9 F7 _, [9 H6 `}  9 _% x1 o9 ?/ m  ^
    public class Invoker {  
    " j9 P" A# P' `( }$ N. J6 o% R6 \- v) t2 c/ o9 T
        private Command command;  
    , g( `" P7 W2 _* p: X/ k' q( m  Z6 E2 O/ g8 @1 H
        public Invoker(Command command) {  ) A9 U  @: C2 e9 m
            this.command = command;  
    % }- F6 x  f% E9 `, @    }  4 R; }. l$ H3 t

    ( y- X' t- p. W1 ]" v    public void action(){  8 j* d1 y" n3 s# |
            command.exe();  0 {9 y! _( z0 v0 ^0 x  D8 d
        }  $ g; j: A3 W/ C5 ]! c
    }  
    $ w$ {8 H: ?2 y+ ^# @public class Test {  
    2 {  e# b) x: d- I! y: L. H  g5 c  V4 r) i" C2 u  \
        public static void main(String[] args) {  
    7 e4 m; X% u; z        Receiver receiver = new Receiver();  $ ?* s  i; E: F6 F& p% i
            Command cmd = new MyCommand(receiver);  & b- }- e$ M% m: Y7 a7 U
            Invoker invoker = new Invoker(cmd);  
      ?- F) w  u( f* k        invoker.action();  
    3 x2 q6 ]5 [5 |0 d: F    }  
    * r1 u- \: j& J% o2 Y* e}  * B9 F  G. J  |, Z
    & R. e6 q* y1 o% a& J
    + P/ v$ W; Y  i% U- {
    这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!% T! Q1 A* ^: v! y/ q
    : d) W* X; a$ L
    介绍
    / _$ O5 m* v- F# @1 E$ e意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。' G2 F) _9 G6 ~9 A2 o
    6 a2 M' U; ]5 R% g3 p0 @& S2 |
    主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。; t0 c" R1 @! o5 K/ A. W
    5 d! t# m7 T3 r5 ~: I" K% e
    何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
    % @/ o' K7 l: \, ?  g
    , b2 v4 Y' h3 {0 K, q+ z6 E如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。; {: T/ E9 S9 z- S7 t/ X

    ; ]/ K' S4 r$ V! p% F( i3 {关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口3 B- u& U) s+ Z( X  N0 X2 q

    2 T5 w0 J! \& ?/ W( K% K应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。
    * S% A, j: m1 ~  C- j  G3 U$ K/ Q# Y5 w0 N/ _2 v8 q$ C$ E1 ~
    优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。+ o% i# ~' a8 i3 L0 u

    # _% D9 V; l5 }0 j0 _. |2 _缺点:使用命令模式可能会导致某些系统有过多的具体命令类。1 ~- ^+ S. F" G# P1 p, }- ~# L

    # O: U5 |& M- M  {  h使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。
    5 f4 k  ~4 D  |. i/ W5 Q
    ! y, n0 t3 \- C+ X$ O7 ^+ j$ C注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。: y+ D9 |  Y  y& ?* w4 D
    ————————————————2 }2 S8 b" `" [( h* G9 Z& K: C
    版权声明:本文为CSDN博主「No_Game_No_Life_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。! V6 N' U6 ]$ j1 x. U6 ~% D2 q
    原文链接:https://blog.csdn.net/No_Game_No_Life_/article/details/85989272
    ; ^1 h) i! _2 h/ r/ s* _  u. l; X+ _% |/ j" D2 ]- s' s
    " E2 ]3 \, h$ R' a/ V+ K& U
    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 10:33 , Processed in 0.610034 second(s), 54 queries .

    回顶部