命令模式可以在一个对象中封装一个请求,把方法调用作为对象进行管理,并在满足时序关系或是满足某些条件的情况下,传递这些对象,并且调用这些对象。在实际应用中将命令抽象成一个接口,所有的命令都实现这个接口,具体命令角色实现接口规定的方法.对象的请求者(Invoker)和命令对象是弱耦合关系, 和接收者(Reciever)都不过问命令的执行过程。命令模式可以作为模板方法的一个替代方案,同时命令模式经常要与中介者模式和备忘录模式协同工作。
命令模式把发出命令的责任和执行命令的责任分开,委派给不同的对象。每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
应用命令模式的一个典型例子就是菜单。菜单项知道何时需要执行一个动作,但是不知道应该调用哪个方法,通过命令模式可以确定对应与每个菜单标记的方法调用。
一个简单的示例如下:
using System;
using System.Collections.Generic;
using System.Text;
namespace CommandPattern
...{
/**//// <summary>
/// 抽象命令角色类:所有具体命令类实现它规定的抽象方法。
/// </summary>
abstract class Command
...{
/**//// <summary>
/// 接收者
/// </summary>
protected Receiver receiver;

/**//// <summary>
/// 构造函数
/// </summary>
/// <param name="receiver">接收者</param>
public Command(Receiver receiver)
...{
this.receiver = receiver;
}

/**//// <summary>
/// 抽象的执行方法
/// </summary>
abstract public void Execute();
}

/**//// <summary>
/// 具体命令(PrintCommand)角色类一:定义一个接受者和行为之间的弱耦合,实现Execute()方法。
/// </summary>
class PrintCommand : Command
...{
/**//// <summary>
/// 构造函数
/// </summary>
/// <param name="receiver"></param>
public PrintCommand(Receiver receiver)
: base(receiver)
...{
}

/**//// <summary>
/// 执行方法
/// </summary>
public override void Execute()
...{
receiver.Print();
}
}

/**//// <summary>
/// 具体命令(PrintCommand)角色类二:定义一个接受者和行为之间的弱耦合,实现Execute()方法。
/// </summary>
class CopyCommand : Command
...{
/**//// <summary>
/// 构造函数
/// </summary>
/// <param name="receiver"></param>
public CopyCommand(Receiver receiver)
: base(receiver)
...{
}

/**//// <summary>
/// 执行方法
/// </summary>
public override void Execute()
...{
receiver.Copy();
}
}

/**//// <summary>
/// 接收者(Receiver)角色类:定义请求执行的方法
/// </summary>
class Receiver
...{
/**//// <summary>
/// 打印
/// </summary>
public void Print()
...{
Console.WriteLine("打印!");
}

/**//// <summary>
/// 复印
/// </summary>
public void Copy()
...{
Console.WriteLine("复印!");
}
}

/**//// <summary>
/// 请求者(Invoker)角色:负责调用命令对象执行请求的方法。
/// </summary>
class Invoker
...{
private Command _printCommand;
private Command _copyCommand;

/**//// <summary>
/// 打印命令
/// </summary>
public Command PrintCommand
...{
get
...{
return _printCommand;
}
set
...{
_printCommand = value;
}
}

/**//// <summary>
/// 复印命令
/// </summary>
public Command CopyCommand
...{
get
...{
return _copyCommand;
}
set
...{
_copyCommand = value;
}
}

/**//// <summary>
/// 构造函数
/// </summary>
/// <param name="printCommand">打印命令</param>
/// <param name="copyCommand">复印命令</param>
public Invoker(Command printCommand, Command copyCommand)
...{
this._printCommand = printCommand;
this._copyCommand = copyCommand;
}

/**//// <summary>
/// 打印
/// </summary>
public void Print()
...{
_printCommand.Execute();
}

/**//// <summary>
/// 复印
/// </summary>
public void Copy()
...{
_copyCommand.Execute();
}
} 
class Program
...{
static void Main(string[] args)
...{
Receiver receiver = new Receiver();
Command printCommand = new PrintCommand(receiver);
Command copyCommand = new CopyCommand(receiver);
Invoker invoker = new Invoker(printCommand, copyCommand);
invoker.Print();
invoker.Copy();
Console.ReadLine();
}
}
}
本文介绍命令模式的基本概念,包括其组成部分如抽象命令、具体命令、接收者及请求者的职责。通过一个示例展示如何使用命令模式解耦请求发送者与接收者。
1284

被折叠的 条评论
为什么被折叠?



