- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563412 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174246
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
+ [ 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
) ?* 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
|