QQ登录

只需要一步,快速开始

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

    ; U7 y( X3 W, b6 eJava设计模式——命令模式$ L6 l, h; F; V( m. R
    0 s# r# U" N) B' m: s, ]/ ^
    命令模式" m  G7 K6 ~0 ]: L$ q9 m* F

    0 \; \% g* v2 R; s/ |' o! `命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:' W" I7 d  `: O5 a& p
    9.png
    $ M7 ]* t) n5 o( I1 n, E, jInvoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码:+ v' J% b% R) a4 A

    7 ^6 J& ?. d* y7 L- Mpublic interface Command {  
    8 S# ?! A/ H8 A    public void exe();  
    1 Z0 P3 G, G, P}  7 `! N8 r% a' }# X
    public class MyCommand implements Command {  
    7 X/ X# L0 A" U: l4 F3 f/ I8 f4 ~7 m+ ^, A- l8 B  e7 \, V
        private Receiver receiver;  . Q' H5 q) a* `4 Z7 l$ Z6 X& N5 S

    0 o* U0 M& v4 ~8 L' b  D    public MyCommand(Receiver receiver) {  6 P% U1 U) W/ Z9 C4 ~- a
            this.receiver = receiver;  ( ~9 E0 C* F4 P  ^# r$ n; P7 i
        }  
    + ~; M0 P4 i* e$ u
    9 H/ a# J0 E, [* Q    @Override  1 h1 W* Z7 |) r0 @6 `( ^- ^4 T% t7 x
        public void exe() {  
    & f, d  K. j! F! F0 `: d, b& P- u        receiver.action();  6 q/ N6 @0 J6 J7 d2 F) x$ w. J
        }  % X6 ?1 T) j8 Z' h( E7 ~" q5 k7 _
    }  
    * P2 s$ F1 B* y) s1 jpublic class Receiver {  ! e5 b3 C- m! t/ w0 L6 ^
        public void action(){  2 A& x9 V" s4 X  j! }* J8 k
            System.out.println("command received!");  
    & N& v9 T7 N8 J    }  
    ! b; g+ I! x$ W4 z- m}  
    $ @. l) ]3 O: R+ k$ rpublic class Invoker {    n! i; B$ v1 `' ]8 k
    $ T8 J3 L$ u  g6 Y
        private Command command;  
    # _/ `' E# L. M0 [" i
    6 g& m! k9 x& p3 D6 Y  A8 C% e    public Invoker(Command command) {  / N6 S  T4 ^/ f' m9 _
            this.command = command;  
    + v  r0 k6 L/ _- _2 e5 M    }  
    * Q+ O8 E& }* w$ G& g
    : ?8 x1 I# G& k0 |/ ~- ], a8 v; K    public void action(){  2 s( X( d7 X6 f6 I& V
            command.exe();  5 a6 v# ?' x( B4 X8 g8 F* S
        }  
    & x& K8 s( w- D3 T: j+ ?}  
    6 @3 B& I0 V# D5 fpublic class Test {  1 A  e( {! R  ?
    * w/ q  L! S) y- [1 g: B
        public static void main(String[] args) {  # d$ @2 q1 Y. Q& \9 u$ O
            Receiver receiver = new Receiver();  
    * z4 c6 s# A7 {+ M/ d- A& A9 D        Command cmd = new MyCommand(receiver);  2 t! L  j1 s0 n/ P
            Invoker invoker = new Invoker(cmd);  
    / x+ Z0 V) [& f$ X4 J" h        invoker.action();  & N6 {  V/ U& Y  g- c
        }  
    % {* p7 }" B# L; }7 ^}  
    : l' a  y& M9 c! {8 G/ @, g* H4 m% a3 F5 {5 J5 F9 T4 T

    1 u/ s& s9 V* }3 A这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!: s$ o; h4 b: n" ?
    ( }5 M1 V1 }! ?' ~4 k5 O; b8 U
    介绍) j2 r7 e( x4 j7 W+ b
    意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。' g  {% \- k  G# N
    7 x# c* w% G; ~/ b- f" A9 C9 z
    主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。/ e  }% U8 q% ?6 N1 x

    & T3 f6 Q3 q. p0 Z# {; N" ~, M何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
    / Y2 R$ x& d$ O5 J/ b! l- c. P- T, G. S( L
    如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。
    8 _( ~* Z2 r9 k- g
    " ~) X6 v' J8 }/ P关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口9 G# C2 Z4 x& H0 r

    ; U  X- u7 e  n2 @7 h$ ^3 v应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。
    0 u, w# J* d; T$ H3 A* g. O6 Z+ S
    优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。3 y* s  }+ t& f3 j4 P/ W' R% \

    0 h+ U4 b' G9 y# g8 V, E缺点:使用命令模式可能会导致某些系统有过多的具体命令类。
    * h" D% G( Q3 b
    4 [( q8 P# {, \使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。
    & A8 `8 u! H7 X' n% K9 J! }" g* m( {8 P/ A" P! j; \
    注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。" C& a6 V& h+ L( k) L
    ————————————————
    9 R; F, z) U/ s9 y& V0 j版权声明:本文为CSDN博主「No_Game_No_Life_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ! g2 g" O) R( V' X% S" P* o$ L原文链接:https://blog.csdn.net/No_Game_No_Life_/article/details/85989272
    9 F3 L  v/ P" ^, Y
    , m  q' e* Z* w. X) Y! j( G5 A$ l; ]
    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 04:21 , Processed in 0.505601 second(s), 54 queries .

    回顶部