QQ登录

只需要一步,快速开始

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

    + [  g! w" y& o+ m3 V5 w, EJava设计模式——命令模式
    ! z- x9 S) g9 [/ `7 s1 R5 G# m$ M" l9 ~# s# R" t& w* p  p
    命令模式
    5 P3 F2 L0 M$ p/ h( E& J" @( i9 z. E, V2 a4 t, b
    命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:
    - u* B& R% f' ~. w' s 9.png
    ) ?* t5 N$ @9 B: D" A, CInvoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码:3 j' F* x$ f6 E: M1 l
    1 `" i' H! Y4 h- ]& d; W
    public interface Command {  
    " n" x* P, g$ `. q  h0 S    public void exe();    l. J+ J9 A  l& A4 a6 Q$ A8 x
    }  
    , Z% f; r! j1 r: @" Y1 u/ [public class MyCommand implements Command {  ' q2 Y& |$ i! h  X+ t5 P! }, D0 w
    3 |! r: k0 k- R  a8 e
        private Receiver receiver;  
    $ O* t- i( S( g6 U+ n0 A, o
    2 n2 K' L! A% L! X' @    public MyCommand(Receiver receiver) {  0 [1 z& D$ ]( g( i7 u
            this.receiver = receiver;  
    + R- b* j5 u$ s) t2 d  i) z6 F+ q    }  
    1 b# `2 h* j1 T
    & N7 Q; |: F- N! a, R- P7 A+ [    @Override  
    ! c7 l& Q+ h- R+ x6 t    public void exe() {  ; N1 \1 ]; ^, h* D3 }
            receiver.action();  2 S2 l" ~$ j( P9 j1 v5 x% g+ U" v# Q5 p
        }  
    / d; J) q) A% ]& K4 p}  
    - o8 X! s( R8 {& \! dpublic class Receiver {  
    ; Z; W& @- k, A# _! O  L    public void action(){  
    8 r! a& O3 O3 D5 I        System.out.println("command received!");  
    / r( v  E2 }5 ^+ T    }  + T- O9 M- i" `& E  b; P& X; R, E( ^
    }  - d% Q  _  B+ ^" R4 J. ^- s% v; F
    public class Invoker {  9 h" T) T6 B/ a2 a$ I& s! F$ o

    . A) o0 }7 N( r) O! Y2 s    private Command command;  / O9 i, n: x, K4 X

    $ u- g) h! k" _1 e    public Invoker(Command command) {  
    : s$ J- w# ~" q5 s4 I& u        this.command = command;  7 i! S1 L( t( G5 l9 L# w' ~
        }  
    : q5 W- j7 ^" s8 B/ z% z. P  j+ b; }! D+ ~$ C- Q
        public void action(){  * x$ X1 }% O7 B# O, l8 B
            command.exe();  
    # B4 Q( K; ?# x  f; ^8 y    }  
    8 O! t* O6 A" p! J) n( a5 `}  
    ; h$ C* p+ Z3 U% K' _public class Test {  
    4 I7 E  N4 w* E& l7 ~6 y
    ( P$ z, [' q7 y9 ?    public static void main(String[] args) {  ! \0 A7 Y) a$ S2 R" }5 J' l* q
            Receiver receiver = new Receiver();  9 O$ L; Q2 a) z1 H& @
            Command cmd = new MyCommand(receiver);  
    2 ]" H. k) R, X! C8 l. S8 w        Invoker invoker = new Invoker(cmd);  
    & F- k6 [- N7 c" Q) q$ f4 @- }" Q        invoker.action();  
    8 b- X# r) D: N6 T0 r; o- H    }  
    * ?4 h$ v4 `7 o, T! L0 l# [5 W}  
    : ], z8 E% z  {/ J  d
    - K& t' k4 i% l; Q. u/ r+ R! Z6 f/ K
    这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!
      ^6 Z+ Y2 i) E& o; A
    9 K# v1 w/ n( b$ E& k4 |* p介绍9 e, I* S6 v9 h
    意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。7 L4 Y, O, x: k. W8 h8 V4 p

      K3 M1 }4 Z  U3 U4 O主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
    : Y3 P/ n8 g  `7 f
    ; A3 s! Q# {( o8 |% u6 V! t何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。2 X3 i1 M% T9 ~8 r0 E6 L

    2 {. S& t( U+ T; I  ^) m2 t如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。- S* S- a! L) p+ d7 A, ^
    " D: ?; r1 W* w) C  g0 r6 K; [
    关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口
    $ {# }, W. w/ R, A+ w6 Z$ B. A- V& @7 R9 a3 w
    应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。
    - h5 A+ g+ Q( P1 x& |0 n3 V8 o: j4 S. F+ @3 ~
    优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。: q5 ]" {2 A5 o" Q, U
    6 g) s  n. s% E6 Q( V
    缺点:使用命令模式可能会导致某些系统有过多的具体命令类。  s1 b8 b0 V( M# v& t$ c

    - x' v5 `! l9 @3 b使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。" R, }6 e+ U" ?9 m
    1 ]  |; e# s* f
    注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。$ C( Z& V/ I% q& L
    ————————————————
    - P/ ?7 \, q/ N版权声明:本文为CSDN博主「No_Game_No_Life_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。4 U  v! Y: o& K/ s3 _
    原文链接:https://blog.csdn.net/No_Game_No_Life_/article/details/85989272
    - B9 I! H# Z9 a" u0 F% l$ X* n5 V8 i# r+ o( m9 s* s; Z3 ^' W
    & X& Y2 {7 V* Z! `- X: l* r
    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-4-21 06:48 , Processed in 0.309198 second(s), 54 queries .

    回顶部