类关系图


类角色说明
1、客户(Client)角色:创建了一个具体命令(ConcreteCommand)对象并确定其接收者。
2、命令(Command)角色:声明了一个给所有具体命令类的抽象接口。这是一个抽象角色。
3、具体命令(ConcreteCommand)角色:定义一个接受者和行为之间的弱耦合;实现Execute()方法,负责调用接收考的相应操作。Execute()方法通常叫做执方法。
4、请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
5、接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。


意图
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。

适用性
抽象出待执行的动作以参数化某对象。你可用过程语言中的回调(Call back)函数表达这种参数化机制。所谓回调函数是指函数先在某处注册,而它将在稍后某个需要的时候被调用。Command模式是回调机制的一个面向对象的替代品。

泡妞的例子
COMMAND—俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有什么指示,就写一张纸条让她弟弟带给我。这不,她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,哪知道他说:“我同时给我姐姐三个男朋友送COMMAND,就数你最小气,才请我吃面。”,:-(

泡妞的代码

using System;
using System.Collections;

public abstract class BoyFriend
{
    
public abstract void Action();
}

// "Receiver"
public class BoyFriendA:BoyFriend
{
    
//行动方法
    public override void Action()
    
{
        Console.WriteLine(
"男朋友甲:请你吃KFC!");
    }

}

// "Receiver"
public class BoyFriendB:BoyFriend
{
    
//行动方法
    public override void Action()
    
{
        Console.WriteLine(
"男朋友乙:请你吃麦当劳!");
    }

}

// "Receiver"
public class BoyFriendC:BoyFriend
{
    
//行动方法
    public override void Action()
    
{
        Console.WriteLine(
"男朋友丙:请你吃炸酱面!");
    }

}

// "Command" 
public abstract class Scrip
{
    
protected BoyFriend boyfriend;
    
public Scrip(BoyFriend boyfriend)
    
{
        
this.boyfriend=boyfriend;
    }

    
abstract public void Execute();
}

// "ConcreteCommand"
public class TheScrip:Scrip
{
    
private string command;
    
public TheScrip(BoyFriend boyfriend):base(boyfriend)
    
{
        command
="MM:最高指示,请我弟弟吃东西。";
        
this.boyfriend=boyfriend;
    }

    
    
public override void Execute()
    
{
        Console.WriteLine(command);
        boyfriend.Action();
    }

}

// "Invoker"
public class DD
{
    
private Scrip scrip;
    
    
public void SendScrip(Scrip scrip)
    
{
        
this.scrip=scrip;
    }

    
    
public void ExecuteScrip()
    
{
        scrip.Execute();
    }

}


public class Client
{
    
public static void Main( string[] args ) 
  

    
// Create receiver, command, and invoker 
    BoyFriend A=new BoyFriendA();
    BoyFriend B
=new BoyFriendB();
    BoyFriend C
=new BoyFriendC();
    TheScrip scrip
=null;
    DD dd
=new DD();
    
    scrip
=new TheScrip(A);
    dd.SendScrip(scrip);
    dd.ExecuteScrip();
    
    scrip
=new TheScrip(B);
    dd.SendScrip(scrip);
    dd.ExecuteScrip();
    
    scrip
=new TheScrip(C);
    dd.SendScrip(scrip);
    dd.ExecuteScrip();
 
  }
 

}




命令模式
命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。

优点
1、命令模式使新的命令很容易地被加入到系统里。
2、允许接收请求的一方决定是否要否决(Veto)请求。
3、能较容易地设计-个命令队列。 可以容易地实现对请求的Undo和Redo。
4、在需要的情况下,可以较容易地将命令记入日志。
5、命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。
6、命令类与其他任何别的类一样,可以修改和推广。
7、你可以把命令对象聚合在一起,合成为合成命令。比如宏命令便是合成命令的例子。合成命令是合成模式的应用。 由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。

缺点
使用命令模式会导致某些系统有过多的具体命令类。某些系统可能需要几十个,几百个甚至几千个具体命令类,这会使命令模式在这样的系统里变得不实际。

posted on 2007-05-14 09:41  十分之七  阅读(304)  评论(0)    收藏  举报