命令模式学习笔记

命令模式:将“请求”封装成对象,以便使用不同得请求,队列或者日志来参数化其他对象,命令模式也支持可撤销得操作!(Head First Design Patterns )
优点:解耦了发送者和接受者之间联系。 发送者调用一个操作,接受者接受请求执行相应的动作,因为使用Command模式解耦,发送者无需知道接受者任何接口。
1. 简单的命令模式
命令接口:
public interface Command {
    
public void execute();
}

关闭灯命令:
public class LightOffCommand implements Command {
 Light light;
 
 
public LightOffCommand(Light light) {
  
this.light = light;
 }

 
 
public void execute() {
  light.off();
 }

}

打开灯命令:
public class LightOnCommand implements Command {
    Light light;
  
    
public LightOnCommand(Light light) {
        
this.light = light;
    }

 
    
public void execute() {
        light.on();
    }

}

灯:
public class Light {

    
public Light() {
    }


    
public void on() {
        System.out.println(
"Light is on");
    }


    
public void off() {
        System.out.println(
"Light is off");
    }

}
命令调用者:
public class SimpleRemoteControl {
    Command slot;
 
    
public SimpleRemoteControl() {}
 
    
public void setCommand(Command command) {
        slot 
= command;
    }

 
    
public void buttonWasPressed() {
        slot.execute();
    }

}
测试类:
public class RemoteControlTest {
 
public static void main(String[] args) {
  SimpleRemoteControl remote 
= new SimpleRemoteControl();
  Light light 
= new Light();
  LightOnCommand lightOn 
= new LightOnCommand(light);

  remote.setCommand(lightOn);
  remote.buttonWasPressed();
    }

}
命令模式得特点:
1》 分布登记统一执行:
在作程序时,经常碰到一些需求,先注册一些操作,并不马上执行,等最终确定后统一执行。如一个具体的例子:用户定制自己的报表,可以订阅饼,柱,折线,曲线图,客户选择相应的报表组合,这样对应一个命令集合,在没确定之前用户可以增删这些报表(命令),等最终确定统一交给调用者根据命令执行,生成组合报表。实现了命令分布提出,确定后统一执行的功能。

2》形如流水线操作:还是出书的例子
//先是一本空白的书:
Book book = new Book();
//找几个作者
Author author1 = new Author();
Author author2 = new Author();
//把写1,2章的名类分别给这两个作者
Command writeCommand = new Write1Command (author1,book);
Command writeCommand = new Write2Command (author2,book);
List commands = new List ();
Commands.add(writeCommand);
//调用者
Invoker invoker = new invoker();
Invoker.setCommands(commands);
//流水写书
invoker.action()
实际上在aciton这一方法中,invoker按照命令,让两个作者流水写作这本书。(类似一个书的流水线加工工厂)
这样我们的书就被流水加工成功(当然这本书只有两章)

这样就给了我们一种系统设计的框架,
模型+工具+命令
客户端产生命令,命令调用工具操作模型。
Book 相当于模型
Author 相当于和多工具类中的一个
Command 命令

3》系统需要支持命令的撤消(undo)。提供redo()方法【容易扩展】
我们可以和容易的加入undo和redo,这个不难理解

4》在Invoker中我们可以实现跟踪,和日志。

5》当系统需要为某项复制增加形的功能的时候,命令模式使新的功能(表现为一种命令)很容易地被加入到服务种里。
命令联系了工具类即执行类和系统逻辑,

简化/变化的命令模式:
命令模式的角色比较多,在实际应用种我们可以根据所需要的功能和不需要的功能加以简化。

1》去掉 调用者
产生命令集合后,我们可以直接在client中迭代执行执行操作
2》 变化 调用者 成为 跟踪者
//调用者
public class Invoker{
List commands; //已经执行完毕的命令集合
public void addCommand (Command command,int i){
commands.add(i,command);
}
public void action(Command command){
//执行操作
command. execute();
//
commands.add(command);
}
}
……………
//还可以有丰富的redo和undo操作;(当然一些都给基于命令类提供的相应方法)
}
这样这个类就记录了所有执行过的操作。

3》去掉 命令 用map替代
我们完全可以用map代替命令,这样无需定义各种命令类
我们改进例子
Author author = new Author();
Publisher publisher = new Publisher ();
Map m = new HashMap;
m.put(author, write);
m.put(author, publisherBook);
在Invoker的action方法:
得代map
运用java反射来调用方法;

4》去掉执行者:
直接在命令中(execute方法种)加业务逻辑。这样只适合于简单的小的系统.

其他要说的内容
1》 将某些参数传给某个方发的方式很多,除了当作方法的参数外还可以当作类的成员便俩变量传入:
这就为命令的抽象带来了极大的方便
abstract class Command
{
abstract public void execute();
}
当我们已经有了执行者(类Test)方法execute(args1,args2 ….argsn)
我们不必向Command加入execute(args1,args2 ….argsn)抽象方法,在说即使加了,在我们迭代的时候也无法判断或十分不容易判断哪个命令调用哪个execute方法。
那么我们可以这样
class ConcreteCommand : Command
{
Test test;
args1
args2
…..
argsn
public override void Execute()
{
test. execute (args1,args2 ….argsn);
}
}
2》 在想跟踪操作的时候,一般为每一个操作对象分配一个调用者,操作对象在调用者中设置。(可以抽象出一个总的调用者,来协调调用每一个具体的调用者)
3》 命令的抽象粒度我觉得是要注意的。
4》 理解思想,不要机械的照搬。消化成自己的,加以灵活的运用和创造在是根本出路。
所谓命令模式的根本思想就是在 先形成命令,在根据命令执行。

参考:http://blog.csdn.net/baggio785/archive/2006/05/23/750513.aspx

posted on 2008-05-05 09:28 扭转乾坤 阅读(313) 评论(1)  编辑  收藏 所属分类: 设计模式

评论

# re: 命令模式学习笔记 2008-05-15 21:06 海天

你好:关于学习《高质量C/C++编程指南》的读后感
我看了你的博客,老师要我们交个报告,论文格式,要八张纸,我写不了这么多体会,能否指教你下,帮我写分体会,让我参考下,谢谢了,QQ309461627

chenhongyunan@126.com  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

导航

统计

常用链接

留言簿(2)

随笔分类(31)

随笔档案(30)

文章分类(32)

文章档案(33)

相册

PHP小站-首页

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜