`
congpeixue
  • 浏览: 274653 次
  • 性别: Icon_minigender_1
  • 来自: ...
社区版块
存档分类
最新评论

命令模式(我的理解)

阅读更多
命令模式(我的理解)
前言
第一章:通常的命令模式
第二章:简化的命令模式
第三章:其他要说的内容
前言
以下是我对命令模式的理解。可能和很多其他文章讲述的不太一样。经过我理解加工的。供大家参考!学艺不精,并且写的比较仓促,还请大家指教。
通常的命令模式:
1.1通常命令模式有一下几个角色
调用者:(命令的执行者)
生成有序的命令队列
按顺序执行命令操作
提供撤销命令操作
记录已经操作的命令
抽象命令:
抽象的命令接口
具体命令:
具体的命令。
由三个要素组成:执行者,执行者要作的操作和被执行的对象组成。当然还可以有其他,比如将对象执行成什么结果。例如:调用Mypait类(执行者)将My rectangle(对象)填充(操作)为红色(结果)。这样就可以完全描述一个命令了。
执行者:
真正执行逻辑操作的对象

1.2原型:

//调用者
public class Invoker{
List commands; //命令集合

public void setCommands(List commands){
this.commands = commands;
}

public void addCommand (Command command,int i){
commands.add(i,command);
}
public void removeCommand (int i){
commands.add(i,command);
}
//得代执行命令
public void action(){
for(Iterator it = list.iterator();it.hasNext();){
Command command = Command) it.next();
Command. execute();
}
}
……………
//还可以有丰富的redo和undo操作;(当然一些都给基于命令类提供的相应方法)
}

//抽象命令
abstract class Command
{
abstract public void execute();
abstract public void unexecute();
abstract public void reexecute();
//一般有这样这个方法,根据需要可以增删
}

// 具体的命令类1:写作命令,选择一个作者(Author类实例对象),让他写作(调用它的write方法)写作的对象是书(Book的实例对象)形成了一个写作的命令,写作的对象是Book的实例
public class WriteCommand implement Command
{
Author author; //执行者
Book book; //要执行的对象
public WriteCommand (Author author,Book book) {
this. author = author;
this. book = book;
}
// 在这里执行要执行的操作
public override void Execute()
{
author.write (book);
}
}

// 具体的命令类2: 出版命令,选择一个出版社(publisher类实例对象),让他出版书(调用它的publisherBook方法)出版的对象是书(Book的实例对象)形成了一个出版的命令
public class PublishCommand implement Command
{
Publisher publisher;
Book book;
public PublishCommand (Publisher publisher) {
this. publisher = publisher;
this. book = book;
}
// Methods
public override void Execute()
{
publisher. publisherBook(book);
}
}

// Publisher和Author类为执行者


这样我们的客户端代码就可以这样写:
//如果我要出一本书
//一本空白的书
Book book = new Book();
//先找一个作者和出版社
Author author = new Author();
Publisher publisher = new Publisher ();
//产生命令集合
Command writeCommand = new WriteCommand (author,book);
Command publishCommand = new PublishCommand(publisher,book);
List commands = new List ();
Commands.add(writeCommand);
//找个调用者,把命令给它,让他来根据命令协调工作
Invoker invoker = new invoker();
Invoker.setCommands(commands);
public void addCommand (Command command,int i){
commands.add(i,command);
}
invoker.action();

特点:
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》 理解思想,不要机械的照搬。消化成自己的,加以灵活的运用和创造在是根本出路。
所谓命令模式的根本思想就是在 先形成命令,在根据命令执行。


转自jdon
分享到:
评论

相关推荐

    [行为型模式]命令模式的理解

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式常用于解耦发出命令的对象(调用者)与...

    设计模式-命令模式

    在实际开发中,理解并合理运用命令模式有助于提高代码质量,增强软件的灵活性和可维护性。通过阅读提供的博客链接(http://blog.sina.com.cn/s/blog_161d504630102wxis.html),你可以找到更多关于命令模式在iOS中的...

    设计模式之命令模式(Command)

    命令模式是一种行为设计模式,它的主要目的是将请求者与接收者解耦,使得请求的发起者无需知道哪个对象会执行这个请求,同时也让...理解并掌握命令模式对于提升软件设计能力,尤其是大型复杂系统的设计有着重要的作用。

    记事本 使用了策略模式和命令模式

    通过分析和学习这些代码,我们可以更深入地理解策略模式和命令模式在实际项目中的应用,同时也能提升自己的编程技巧和设计思维。 总的来说,策略模式和命令模式在记事本软件中的应用展示了设计模式在提高代码质量、...

    设计模式C++学习之命令模式(Command)

    命令模式是一种行为设计模式,它将请求封装为一个对象,使得可以使用不同的请求、队列或者日志请求,也可以支持可撤销的操作。...在C++项目中,合理运用命令模式可以优化系统结构,使代码更加易于理解和扩展。

    Qt-命令模式

    总的来说,命令模式是Qt编程中一个非常实用的设计模式,它能帮助我们编写更加模块化、易于理解和维护的代码,同时提供了实现高级功能如撤销/重做的基础。通过熟练掌握命令模式,开发者可以更好地应对复杂项目的需求...

    C#命令模式应用

    首先,我们要理解命令模式的基本结构。在C#中,一个命令模式通常包含以下几个角色: 1. **Invoker(调用者)**:调用接收者来完成特定任务的角色,不关心接收者是谁,只负责发送命令。 2. **Receiver(接收者)**:...

    命令模式代码示例

    命令模式是一种行为设计模式,它将请求封装为一个对象,...通过以上内容,我们对命令模式有了深入的理解,包括它的角色、工作原理以及如何在代码中实现。这个示例代码和文档为学习和实践命令模式提供了很好的参考资料。

    命令模式代码demo

    通过这个命令模式的代码demo,你可以理解如何在实际项目中使用命令模式来提高代码的灵活性和可维护性。它帮助我们降低了模块间的耦合,使得系统更加易于扩展和重构。学习和掌握命令模式,将使你在设计和实现复杂系统...

    设计模式之命令模式案例代码

    通过阅读这些代码,你可以更清楚地理解命令模式如何在实际项目中工作。例如,可能存在多个具体命令类,每个类对应接收者的一个特定操作。调用者根据需要设置不同的命令,然后执行这些命令。 命令模式的应用场景广泛...

    命令模式 C++ 实现

    首先,我们需要理解命令模式的基本组成部分: 1. **命令接口(Command Interface)**:定义了执行命令的接口,通常包含一个执行操作的方法,如`execute()`。 2. **具体命令(Concrete Command)**:实现了命令接口,...

    设计模式之命令模式(Command Pattern)

    命令模式是一种行为设计模式,它将请求封装成独立的对象,使得可以使用不同的请求、队列请求、记录请求历史以及支持可撤销的操作。...理解并熟练运用命令模式,对于提升软件设计的质量和复用性具有重要意义。

    设计模式之命令模式详解(内附有例子,无源码)

    命令模式是一种行为设计模式,它将请求封装为...通过深入理解并应用命令模式,开发者能够更好地设计系统,使其更加灵活、可扩展且易于维护。在实际开发过程中,命令模式常用于事件驱动系统、GUI编程、事务处理等领域。

    设计模式作业——用命令模式java语言编写的烧烤店

    首先,理解命令模式的关键在于它的四个主要角色: 1. **Command(命令)接口**:定义了接收者应执行的命令操作。在烧烤店的场景中,这可能是下单、取消订单等操作。 2. **Concrete Command(具体命令)类**:实现了...

    路由器常用命令模式设置

    ### 路由器常用命令模式设置 在IT网络管理领域,路由器作为核心设备之一,其配置与管理显得尤为重要。本文将围绕路由器的常用命令及其功能进行详细介绍,旨在帮助网络管理员更好地理解和掌握这些命令,从而有效地...

    命令模式最简单实现

    在`CommandPattern.zip`文件中,可能包含了这个模式的示例代码,你可以进一步查看和学习这些代码,以便更好地理解和应用命令模式。记住,虽然这是一个简单的实现,但命令模式的威力在于其能够适应复杂的需求,例如在...

    命令设计模式示例

    在压缩包`commandPro`中,可能包含了一系列关于命令设计模式的实例代码,你可以通过查看这些代码更深入地理解命令模式的实现和应用。这些代码可能包括不同类型的命令,例如批处理命令、可撤销命令等,以及如何在实际...

    命令模式Demo

    在"CommandPatternDemo"中,你将有机会看到这些概念如何在实际代码中体现,通过运行和分析这个Demo,你将能更好地理解和应用命令模式于你的项目中。无论是在GUI编程、事务处理、还是游戏设计等领域,命令模式都有...

    命令模式demo

    在本示例"命令模式demo"中,我们将深入理解这一模式的实现与应用。 首先,命令模式的核心组成部分包括:**命令接口(Command Interface)**、**具体命令类(Concrete Command)**、**接收者(Receiver)**和**调用...

Global site tag (gtag.js) - Google Analytics