QQ登录

只需要一步,快速开始

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

    . P$ [: x7 [) b$ i/ C* y* X8 @1 t; YJava设计模式——命令模式; k, p- T( n. v$ h# R8 @

    * s# s( |* R: [/ d命令模式
    6 d8 ]( H, M' y/ }; Q4 X' b7 Y; E* l
    命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:4 \; D4 t$ L& g" ~3 |. a/ N" O
    9.png
    + h) @8 {, u: t/ g6 e0 ]7 NInvoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码:) Z( f2 g/ \4 o2 v" Y8 [
    + t' _* D  Q6 [' D0 `# q; l! {+ V
    public interface Command {  
    8 r2 R. q: E3 y4 M5 D    public void exe();  " ^. ?( Y+ R' B: _0 X; [* W* |5 s
    }  
    * ]/ `& i! u* X3 D- npublic class MyCommand implements Command {  
    1 u5 o2 C: N: @1 {- w; G  a6 t7 U0 n' {
    / U& @7 k7 K0 p/ Q7 ]' J' w    private Receiver receiver;  
    : a7 d8 Z( c7 S1 t; p/ m, |
    ! v: G$ }, m2 i# E- d    public MyCommand(Receiver receiver) {  7 U# P- D$ z' d! R( k
            this.receiver = receiver;  6 b. [% A- f% Z7 }1 w
        }  
    / Y+ S2 m+ V. [3 a9 j  s* V0 ]+ [6 p. H* p# r# ]% J1 S
        @Override  ; t0 B! K# l8 Y
        public void exe() {  
    9 F- i5 f$ J6 Q4 p$ W        receiver.action();  8 T# K/ r* Q: L3 h6 f
        }  & B5 Q4 i3 Q3 Z+ J
    }  ( [. z' t, I# c
    public class Receiver {  
    ; P- z! U3 e" @- O0 I' K" Q( W4 D    public void action(){  
    % y& O( F: W3 S" r% X# D        System.out.println("command received!");  
    & b3 u) L) {2 F- G% c# R" J    }  7 {) {, W$ L# c2 O
    }  9 q2 b  g4 V4 P1 _; R8 o
    public class Invoker {  
    ( N7 s5 t% w) Z: a! S- ]- |
    / m5 `8 [+ D1 H3 l1 N    private Command command;  1 Q) |3 m3 v, e4 F

    6 L- Z/ g% K, U2 z3 b# v. q4 p1 Y* N    public Invoker(Command command) {    L" m: t; u( P: p5 o
            this.command = command;  
    6 \7 O: T8 m8 u* T: b1 h    }  
    5 i' Z- ^3 w& a2 z0 b% h: a+ H* _4 z+ m$ r+ P' b3 c
        public void action(){  
    2 [% r# B; f4 X4 o6 J" |        command.exe();    O3 ?. e0 U* s( N. Y& \4 R0 M- Z
        }  7 {* C% c6 \$ u
    }  
    3 m# m1 @5 C- x8 K8 rpublic class Test {  
    * z" j0 u  E; e; B8 x) F/ y( I( V4 B! z3 q$ T9 l
        public static void main(String[] args) {  
    4 K2 z8 f3 K: B% x- T, C        Receiver receiver = new Receiver();  
    ! e, ^9 ~5 J6 y/ f. w" l# w( g        Command cmd = new MyCommand(receiver);  
    " X' l9 m3 B7 A. W! e7 f        Invoker invoker = new Invoker(cmd);  
    ( i" q. I' b. A        invoker.action();  : d+ ^! c$ D  z6 ^. I+ _2 m+ C
        }  
    8 G0 N/ `* w# }}  1 P0 Z+ E5 |2 [: g

    0 R# i# L7 S+ G$ b$ x6 ]: r: F9 q( L' p+ G5 M# r
    这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!
    7 B: t. z1 a, n+ p) |
    # r9 c! e; U' U+ O# _. \/ H' V介绍5 X! W/ p0 b/ {7 R
    意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。$ p$ d5 N$ h' a4 S- b& r

    8 o3 y$ N  n* [% B; K! L, Z. \主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。( p7 s) z" s1 T! U; o9 s

    # j$ B2 Z# z# D& _9 M! K0 P何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。$ U' B, w6 w9 C& M8 n
    ! L9 W0 q& |# N2 q2 T
    如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。
    ; u5 j9 G) q1 D! B, e
    6 N2 v/ B( U) C( u- f" u4 ~关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口
    % G9 x0 K& W& _/ b& y0 O8 ~' |
    9 B: v3 X' M* T( i* k应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。
    ; f! e1 ^3 m4 q8 r- t9 P8 g' p4 K& J/ A
    优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
    / K$ u5 q7 d. b5 @8 R, X( ~& o5 V/ {& P; v
    缺点:使用命令模式可能会导致某些系统有过多的具体命令类。" [: s: B2 r! Z. n" J7 J8 T

    2 [1 `( {4 P: t1 h. Q使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。: w2 F: `" R  R1 K3 l
    ; P" u9 Q( y* b* R  q% J
    注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。
    3 T! {% S( e* Z! T' U. i* d————————————————$ O& ^, y1 t, x1 U
    版权声明:本文为CSDN博主「No_Game_No_Life_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    & [- M+ d* I' X  S6 @4 f+ u* m原文链接:https://blog.csdn.net/No_Game_No_Life_/article/details/85989272
    5 b3 T6 m) P# r' ]5 D- V9 ]6 }7 |' o5 g4 ~
    % e' w. ~# c, ]2 {/ ?  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, 2025-8-19 21:36 , Processed in 1.091472 second(s), 53 queries .

    回顶部