`

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

阅读更多

定义:
     将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。(网上很多地方引用的定义)
     将请求封装成对象,以便使用不同的请求、队列或日志来参数化其他对象。命令模式也支持可撤销的操作。                     (Head First 的定义)
   解读: 请求说的更傻一点就是求别人为自己服务,对应到程序中,向别人提供服务的话好像离不开方法,请求大概就是对方法的调用了。不过请求这个词语,感觉有点怪怪。因为我调用B对象的C方法,不怎么像是向B请求C倒是像强制B执行C,B有不执行C的权利吗?(当开个玩笑)。提到参数化,就会想到"定义一个参数",参数说白了就是一个占位符、一个变量到时想放什么放什么。参数化就先理解成变量化、动态化吧。“从而使你可用不同的请求对客户进行参数化”这句话还是很难理解啊,关键是这个"客户".客户肯定是服务享受者嘛,那就应该是命令的调用者,好像不太合理。Head First 中有一句话,"一整天下来,女招待参数化了许多订单。这个对应到命令模式的理解就是命令传递着参数化命令对象,即命令对象(或者命令接口更合理吧)成为命令传递者的一个(组)成员,或其函数中的参数。再直接看看Head First中的定义,根据"一整天下来,女招待参数化了许多订单" 我们知道"其他对象"就是命令对象。使用不同请求来参数化命令对象,在这里请求理解成方法调用已经不合适了。把请求在程序中说到底就是一种命令,"命令对象"--就是命令接口,翻来覆去翻来覆去成了把命令接口动态的实例化成命令对象。晕死,写了这么多我当在写小品剧本。
再说一下封装,封装一般就是隐藏具体细节,提高独立性。有时候还可以见到把某某功能封装到一个对象,这个似乎有点像外包。算了打住打住。。。
http://www.javathinker.org/main.jsp?bc=showessay.jsp&filename=java/fengzhuang.htm

结构图


一个命令大概也就涉及到5个东西,命令发送者、命令传递者、命令本身(就是命令对象嘛)、命令执行者、命令执行结果(不考虑)。

描述:

    允许"发送请求的对象"和"接受并执行这些请求的对象分割开来"。算了受那个定义的打击我还是用自己的话补充一下吧,调用者和执行者之间相互解耦,命令对象中本身包含了执行者的信息。调用者只需要有一个命令对象,就可以完成他要的工作。执行者的每一种可能的操作都封装成一种命令,调用者识别的是命令的抽象。
这样调用者是独立于执行者的能力的增长、变化的。 (调用者对应类图下面的命令传递者吧)

实例分析:
下面我们来看看电风扇

 这是电风扇类

 class CeilingFan
    
{
        
public const int HIGHT = 3;
        
public const int MEDIUM = 2;
        
public const int LOW = 1;
        
public const int OFF = 0;

       // System.Collections.Generic.Stack
<ICommand> commandStack = new Stack<ICommand>();

        
public int Speed;
        
public void Hight()
        
{
            
this.Speed = HIGHT;
            Console.WriteLine(
"HIGHT");
        }

        
public void Low()
        
{
            
this.Speed = LOW;
            Console.WriteLine(
"Low");
        }

        
public void Medium()
        
{
            
this.Speed = MEDIUM;
            Console.WriteLine(
"medium");
        }

        
public void Off()
        
{
            
this.Speed = OFF;
            Console.WriteLine(
"Off");
        }

        
//public ICommand GetPreCommand()
        
//{
        
//    ICommand command = new NullCommand();
        
//    if (commandStack.Count > 1)
        
//    {
        
//        command = commandStack.Pop();
        
//    }
        
//    return command;
        
//}
        
//public bool HasNext()
        
//{
        
//    return this.commandStack.Count > 0;
        
//}
        
//public void CommandStatckAdd(ICommand command)
        
//{
        
//    this.commandStack.Push(command);
        
//}
        public int GetSpeed()
        
{
            
return Speed;
        }


    }

//命令接口  实现操作,和撤销功能。

 interface ICommand
    
{
         
void Execute();
         
void Undo();
    }


//命令对象具有电风扇的引用。CeilingFanHightCommand 是把电风扇调为高档的命令对象,对应还有中档 CeilingFanMediumCommand、低档、关闭对象
所有的实际操作都有电风扇自己完成。现在我们暂时不考虑撤销操作,也就是不用理会 IUndo 和 CeilingFanUndo;

 class CeilingFanHightCommand : ICommand
    
{
        CeilingFan ceilingFan;

        IUndo ceilingFanUndo 
= new CeilingFanUndo();

        
int perSpeed;

       
public CeilingFanHightCommand(CeilingFan ceilingFan)
        
{
            
this.ceilingFan = ceilingFan;
        }

        
public void Execute()
        
{
            perSpeed 
= ceilingFan.GetSpeed();
           
// ceilingFan.CommandStatckAdd(this);
            this.ceilingFan.Hight();
        }

        
public void Undo()
        
{
            ceilingFanUndo.Undo(perSpeed,ceilingFan);
        }


    }



测试代码:

 CeilingFan ceilingFan = new CeilingFan();

            CeilingFanHightCommand hightCommand 
= new CeilingFanHightCommand(ceilingFan);
            hightCommand.Execute();

            CeilingFanMediumCommand mediumCommand 
= new CeilingFanMediumCommand(ceilingFan);
            mediumCommand.Execute();

            CeilingFanLowCommand lowCommand 
= new CeilingFanLowCommand(ceilingFan);
            lowCommand.Execute();

            CeilingFanOffCommand offCommand 
= new CeilingFanOffCommand(ceilingFan);
            offCommand.Execute();


   看到这里好像没有发现调用者和执行者之间的解耦。 上面代码中有电风扇,有命令对象。测试代码应该在调用者中还是传递者中呢。


命令模式代码下载

分享到:
评论

相关推荐

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

    命令模式是一种行为设计模式,它将请求封装成独立的对象,使得可以使用不同的请求、队列请求、记录请求历史以及支持可撤销的操作。这种模式在软件工程中被广泛应用,尤其是在需要解耦请求发起者和接收者时,提高了...

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

    **设计模式之Command(命令)模式** Command模式是一种行为设计模式,它将请求封装为一个对象,使得可以使用不同的请求、队列或者日志请求,同时支持可撤销的操作。这种模式在软件工程中广泛应用于解耦请求的发送者...

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

    命令模式是一种行为设计模式,它的主要目的是将请求者与接收者解耦,使得请求的发起者无需知道哪个对象会执行这个请求,同时也让系统更容易扩展。这种模式在软件工程中广泛应用,特别是在事件驱动和分布式系统中。 ...

    c++-设计模式之命令模式(Command Pattern)

    命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为对象,从而使您可以使用不同的请求、队列请求或日志请求,并支持可撤销操作。命令模式通常用于实现操作的解耦,使得发送者和接收者之间不直接关联...

    设计模式之命令模式

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

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

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在本文中,我们将深入探讨命令模式的原理、结构和实际应用,并...

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

    命令模式是一种行为设计模式,它将请求封装为一个对象,使得可以使用不同的请求、队列或者日志请求,也可以支持可撤销的操作。在C++中,命令模式的应用可以帮助我们更好地组织代码,提高代码的可扩展性和可维护性。...

    [行为模式] head first 设计模式之命令模式(Command)

    【行为模式】Head First 设计模式之命令模式(Command) 命令模式是一种行为设计模式,它将请求封装为一个对象,从而使我们能支持可撤销的操作、参数化对象以及将请求排队等高级操作。在Head First的设计模式书中,...

    设计模式-command

    命令模式是一种行为设计模式,它的主要目的是将命令的发送者与接收者解耦。在“设计模式-command”中,我们看到这个模式的应用,通过将一个操作封装为一个对象(即命令对象),使得发送者可以无需知道接收者的具体...

    C++设计模式代码资源23_Command_命令模式.zip

    **C++设计模式:命令模式** 命令模式是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列或者记录请求日志,同时支持可撤销的操作。在C++编程中,命令模式是一种非常实用的设计模式,能够...

    命令模式(Command模式)

    **命令模式(Command模式)详解** 命令模式是一种行为设计模式,它将请求封装为一个对象,使得我们可以使用不同的请求、队列或者记录请求日志,还可以支持可撤销的操作。在命令模式中,我们创建表示各种操作的类...

    (行为型模式) Command 命令模式

    ### (行为型模式) Command 命令模式 #### 概述 在软件工程领域,设计模式被广泛地应用于解决常见的编程难题。其中,“Command”(命令)模式是一种行为型设计模式,它允许将请求封装成对象,从而使你能够用不同的...

    Head First 设计模式 (六) 命令模式(Command pattern) C++实现

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Head First 设计模式这本书中,第六章详细介绍了如何在C++中...

    设计模式之Command模式和代码实现

    Command模式是一种行为设计模式,它的主要目的是将命令的发起者(Invoker)与命令的执行者(Receiver)解耦。在Command模式中,一个命令对象封装了特定的请求,调用者(Invoker)只需要知道如何发送命令,而无需知道...

    设计模式之命令模式源码示例

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式广泛应用在各种场景中,以提高代码的灵活...

    Command模式(Java设计模式)

    Command模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java编程中,这种模式被广泛应用于实现命令行操作、GUI事件...

    23钟设计模式之命令模式

    命令模式是一种行为设计模式,它的主要目的是将请求封装为一个对象,以便支持可撤销的操作、参数化不同命令以及将命令的执行与请求者解耦。在23种经典设计模式中,命令模式因其灵活性和实用性而被广泛使用。 在命令...

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

    文档“设计模式18:Command(命令模式).docx”可能详细解释了该模式的原理和应用实例,而“命令模式.doc”可能是另一个角度的解释或补充说明。 通过深入理解并应用命令模式,开发者能够更好地设计系统,使其更加灵活...

    设计模式之命令模式Java实现

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Java中实现命令模式,我们可以按照以下步骤进行: 1. **定义...

Global site tag (gtag.js) - Google Analytics