- 浏览: 141401 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
randyjiawenjie1:
终于遇到一个人讲清楚了
阻塞I/O,非阻塞I/O -
dxqrr:
学习了。。。。
java中堆和堆栈的区别 -
tanhong:
[color=yellow][/color] ...
“is a”和“has a”的区别 -
uuid198909:
代码看着是比较………………
JDK5新特性--java.util.concurrent Semaphore(8) -
heipark:
兄弟,咱这代码纠结了点....
JDK5新特性--java.util.concurrent Semaphore(8)
一,命令模式的实现:
命令模式里边一般都有以下几个角色:客户端,请求者,命令接口,命令实现,接受者,
下边是简单命令模式的实现代码实现:
1 public class Client{
2 public static void main(String[] args){
3 Receiver receiver = new Receiver();
4 Command commandOne = new ConcreteCommandOne(receiver);
5 Command commandTwo = new ConcreteCommandTwo(receiver);
6 Invoker invoker = new Invoker(commandOne,commandTwo);
7 invoker.actionOne();
8 invoker.actionTwo();
9 }
10 }
11 public class Invoker{
12 private Command commandOne;
13 private Command commandTwo;
14 public Invoker(Command commandOne,Command commandTwo){
15 this.commandOne = commandOne;
16 this.commandTwo = commandTwo;
17 }
18 public void actionOne(){
19 commandOne.execute();
20 }
21 public void actionTwo(){
22 commandTwo.execute();
23 }
24 }
25 public interface Command{
26 void execute();
27 }
28 public class ConcreteCommandOne implements Command{
29 private Receiver receiver
30 public ConcreteCommandOne(Receiver receiver){
31 this.receiver = receiver;
32 }
33 public void execute(){
34 receiver.actionOne();
35 }
36 }
37 public class ConcreteCommandTwo implements Command{
38 private Receiver receiver
39 public ConcreteCommandTwo(Receiver receiver){
40 this.receiver = receiver;
41 }
42 public void execute(){
43 receiver.actionTwo();
44 }
45 }
46 public class Receiver{
47 public Receiver(){
48 //
49 }
50 public void actionOne(){
51 System.out.println("ActionOne has been taken.");
52 }
53 public void actionTwo(){
54 System.out.println("ActionTwo has been taken.");
55 }
56 }
二,命令模式的功能,好处,或者说为什么使用命令模式?
上边的代码是否看起来很傻呢,本来可以这样简单实现的:
1 public class Client{
2 public static void main(String[] args){
3 Receiver receiver = new Receiver();
4 receiver.actionOne();
5 receiver.actionTwo();
6 }
7 }
8 public class Receiver{
9 public Receiver(){
10 //
11 }
12 public void actionOne(){
13 System.out.println("ActionOne has been taken.");
14 }
15 public void actionTwo(){
16 System.out.println("ActionTwo has been taken.");
17 }
18 }
看多简洁,如果是像上边如此简单的需求,这个才应该是我们的选择,但是有些情况下这样的写法不能解决的,
或者说解决起来不好,所以引入命令模式.
(1)我们须要Client和Receiver同时开发,而且在开发过程中分别须要不停重购,改名
(2)如果我们要求Redo ,Undo等功能
(3)我们须要命令不按照调用执行,而是按照执行时的情况排序,执行
(4)开发后期,我们发现必须要log哪些方法执行了,如何在尽量少更改代码的情况下实现.并且渐少重复代码
(5)在上边的情况下,我们的接受者有很多,不止一个
解决办法:
情况一,我们可以定义一个接口,让Receiver实现这个接口,Client按照接口调用。
情况二,我们可以让Receiver记住一些状态,例如执行前的自己的状态,用来undo,但自己记录自己的状态
实现起来比较混乱,一般都是一个累记录另一个类的状态.
情况三,很难实现
情况四,,我们须要在每个Action,前后加上log
情况五,相对好实现,但是再加上这个,是否感觉最终的实现很混乱呢
好,我们再来看看命令模式,在命令模式中,我们增加一些过渡的类,这些类就是上边的命名接口和命令实现,
这样就很好的解决了情况一,情况二。我们再加入一个Invoker,这样情况三和情况四就比较好解决了。
如下加入Log和排序后的Invoker
1 public class Invoker{
2 private List cmdList = new ArrayList();
3 public Invoker(){
4 }
5 public add(Command command){
6 cmdList.add(command);
7 }
8 public remove(Command command){
9 cmdList.remove(command);
10 }
11 public void action(){
12 Command cmd;
13 while((cmd =getCmd()) != null){
14 log("begin"+cmd.getName());
15 cmd.execute();
16 log("end"+cmd.getName());
17 }
18 }
19 public Command getCmd(){
20 //按照自定义优先级,排序取出cmd
21 }
22 }
23 public class Client{
24 public static void main(String[] args){
25 Receiver receiver = new Receiver();
26 Command commandOne = new ConcreteCommandOne(receiver);
27 Command commandTwo = new ConcreteCommandTwo(receiver);
28 Invoker invoker = new Invoker();
29 invoker.add(commandOne);
30 invoker.add(commandTwo);
31 iinvoker.action();
32 }
33 }
三,命令模式与其它模式的配合使用:
1,看上边的Invoker的实现是否很像代理模式呢,Invoker的这种实现其实就是一种代理模式。
2,需求:有个固定命令组合会多次被执行
解决:加入合成模式,实现方法如下,定义一个宏命令类:
1 public class MacroCommand implements Command{
2 private List cmdList = new ArrayList();
3 public add(Command command){
4 cmdList.add(command);
5 }
6 public remove(Command command){
7 cmdList.remove(command);
8 }
9 public void execute(){
10 Command cmd;
11 for(int i=0;i<cmdList.size();i++){
12 cmd = (Command)cmdList.get(i);
13 cmd.execute();
14 }
15 }
16 }
3,需求:须要redo undo
解决:加入备忘录模式,一个简单的实现如下
1 public class ConcreteCommandOne implements Command{
2 private Receiver receiver
3 private Receiver lastReceiver;
4 public ConcreteCommandOne(Receiver receiver){
5 this.receiver = receiver;
6 }
7 public void execute(){
8 record();
9 receiver.actionOne();
10 }
11 public void undo(){
12 //恢复状态
13 }
14 public void redo(){
15 lastReceiver.actionOne();
16 //
17 }
18 public record(){
19 //记录状态
20 }
21 }
4,需求:命令很多类似的地方
解决:使用原型模式,利用clone
这个就不写例子了。
四,命令模式的使用场合
1,须要callback的时候,例如java awt/swing/swt中的Listening的消息方式
2,须要对请求排队执行,命令的发送者和接受者有不同对的生命周期,就是命令执行的时候,可能发出命令的
Client已经不存在了
3,须要Redo Undo等函数
4,须要log每条命令
5,须要支持transaction,封装一组数据命令的时候.
五,最后再次总结一下命令模式的优点和缺点:
优点:
降低Client和命令接受者的耦合,是命令请求和命令执行的对象分割
便于修改和扩张
便于聚合多个命令
缺点:
造成出现过多的具体命令类,太多文件。
五,一个比较有意思的例子,来说明命令模式
Client :看电视的人
Invoker :遥控器
Command :电信号
具体命令 :遥控器上的按键对应的不同的电信号
Receiver :电视机
最后说一句,并不是全部按照模式写一定就好,应该根据你的需求来应用,或者全部应用,或者部分应用,或者根本不用。
发表评论
-
【转】话说状态模式和策略模式
2008-11-26 17:07 1340图 1 :策略模式类图 ... -
温习-策略模式
2008-11-26 16:04 799下面的情况考虑使用策略模式: 1、一个系统中有许多类,他们 ... -
深入浅出Java模式设计之模板方法模式
2008-06-24 00:07 1173一、引子 这是一个很简单的模式,却被非常广泛的使 ... -
软件的可维护性和可复用性
2008-06-14 14:24 1257ξ 3.1 软件系统的可维护 ... -
开闭原则
2008-06-14 13:38 1032ξ 4.1 什么是开闭原则 ... -
依赖倒转原则
2008-06-14 13:15 1205☆ 依赖倒转原则,要依赖于抽象,而不要依赖于具体实现。 ξ 8 ... -
java设计模式之设计原则
2008-06-14 13:02 29171.开—闭原则(Open-Closed Principle, ... -
“is a”和“has a”的区别
2008-06-14 12:53 1934“is a”代表的是类之间的继承关系,比如PC机是计算机,工作 ... -
复用的基本种类
2008-06-14 12:47 1305复用的基本种类: 合成/聚合复用 : 优点: * 新对象存取 ... -
合成/聚合复用原则
2008-06-14 12:45 1721☆ 合成/聚合复用原则 ... -
第五个设计模式:合成模式
2008-06-14 12:26 864第五个设计模式:合成模式 合成模式 把部分和整体关系用 ... -
Effective java学习笔记1:考虑使用静态工厂方法代替构造方法
2008-06-12 21:52 994我们要得到一个对象,马上想到构造方法,其实,静态工厂方法也 ... -
java设计模式之工厂模式(简单工厂方法)
2008-06-12 21:32 5818工厂模式总述 工厂模式属于类的创建模式,工厂模式专门负 ... -
设计模式之Visitor
2008-05-26 14:15 743设计模式之Visitor 板桥里人 http://www. ... -
深入浅出Java的访问者模式
2008-05-26 00:09 1060一、引子 对 ... -
简单工厂模式
2008-05-22 14:51 12091、简单工厂模式,是类的创建模式。 2、工厂模式负责将大量 ... -
状态模式和策略模式的比较
2008-05-22 01:18 1294状态模式(state pattern) ... -
模式与原则
2008-05-21 13:32 748最近看了一些模式和方法论的东西。 在这五十多种模式中, ...
相关推荐
设计模式--命令模式java例子
JAVA-设计模式-行为型模式-命令模式
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向...设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
在 Java 中,命令模式的实现通常涉及一个命令接口和一个或多个具体命令类,这些类实现了命令接口,并在其 execute() 方法中定义了实际的命令逻辑。 命令模式的组成部分: 1. 命令接口(Command):定义了 execute...
JAVA设计模式-原则和23种设计模式归纳总结 本资源主要介绍了JAVA设计模式的原则和23种设计模式的总结。设计模式是软件设计中的一种解决方案,能够使软件系统更加灵活、可维护和可扩展。本资源首先介绍了设计模式的...
基于java程序语言的设计java模式课程 17-命令模式(共32页).pptx 基于java程序语言的设计java模式课程 18-解释器模式(共25页).pptx 基于java程序语言的设计java模式课程 19-迭代器模式(共27页).pptx 基于java...
20020_RocketMQ_管理员命令 JAVA-ACE-架构师系列视频教程RocketMQ订单实战下目录介绍: 101_rocketmq_实战项目介绍(免费观看) 202_rocketMQ实战项目设计(一) 303_rocketMQ实战项目设计(二) 404_rocketMQ实战-...
该PPT用于公司内部分享设计模式6---命令模式之用,言简意赅,形象生动.故此分享,希望大家一起学习
Java设计模式详解 Java设计模式是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高... * 命令模式 * 备忘录模式 * 状态模式 * 访问者模式 * 中介者模式 * 解释器模式
1.3.2 命令模式 40 1.3.3 解释器模式 43 1.3.4 迭代器模式 45 1.3.5 中介者模式 49 1.3.6 备忘录模式 52 1.3.7 观察者模式 54 1.3.8 状态模式 58 1.3.9 策略模式 61 1.3.10 模板方法 63 1.3.11 访问者模式 65
计算机后端-Java-图解java设计模式104 命令模式(4)-Jdbc.avi
java 设计模式 单例模式 工厂模式 命令模式 模式解析 各种模式的最全面的解析 最朴实的话语
72-Java设计模式 命令模式1
15.3.3 命令模式的使用场景 15.4 命令模式的扩展 15.4.1 未讲完的故事 15.4.2 反悔问题 15.5 最佳实践 第16章 责任链模式 16.1 古代妇女的枷锁—“三从四德” 16.2 责任链模式的定义 16.3 责任链模式的应用 16.3.1 ...
计算机后端-Java-图解java设计模式102 命令模式(2.avi
计算机后端-Java-图解java设计模式103 命令模式(3.avi
计算机后端-Java-图解java设计模式101 命令模式(1).avi
计算机后端-Java-图解java设计模式105 命令模式(5).avi
18命令模式:定义命令接口、定义接受者、实现具体命令接口命令模式:定义命令接口、定义接受者、实现具体命令接口 设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板全文共22页,当前为第19页。 19备忘录模式...
命令模式:某个方法需要完成某一个行为,但这个行为的具体实现无法确定,必须等到执行该方法时才可以确定, * 这是一个命令模式的一个实例