您的位置:首页 > 其它

浅谈设计模式之命令模式

2016-06-03 10:41 176 查看
命令模式(Command):将一个请求封装成一个对象,从而使你可以用不同的请求对客户端进行参数化,队请求排队或者记录请求的日志,以及支持可撤销的操作。

关于这个命令我们用一个简单的例子来说明,比如键盘的指令,不同的按键按下就会执行不同的命令。在这里我们用键盘按键发出命令,电脑接收这些命令,然后执行不同的操作,也就是完成了一系列的命令指示。

UML图如下:



//声明执行操作的接口
abstract class Command
{
protected Receiver receiver;
public Command(Receiver receiver)
{
this.receiver = receiver;
}
abstract public void Execute();
}

//知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者,只要它能够实现命令要求实现的相应功能。
class Receiver
{
public void Action()
{
Print("执行相关请求");
}
}

//将一个接受者对象绑定于一个动作,调用接受者相应的操作
class ConcreteCommand : Command
{
public ConcreteCommand(Receiver receiver):base(receiver){}
public override void Excute()
{
receiver.Action();
}
}

//要求该命令执行这个请求
class Invoker
{
Command command;
//命令如果有多个的情况,这样也就可以在执行之前撤销命令了
//List<Command> commands = new List<Command>();
public void SetCommond(Command command)
{
this.command = command;
}
public void ExecuteCommand()
{
command.Execute();
}
}

//测试
static void Main(sting[] args)
{
Receiver r = new Receiver();
Command c = new ConcreteCommnd(r);
Invoker i = new Invoker();

i.SetCommand(c);
i.ExecuteCommand();
Console.Read();
}


命令模式的优点总结如下:

1. 它能比较容易地设计一个命令队列

2. 在需要的情况下,可以较容易的将命令记入日志

3. 允许接收请求的一方决定是否否决请求

4. 可以很容易地实现对请求的撤销和重做

5. 容易增加新的具体命令类,当然这个也容易成为它的缺点==

6. 可以把请求一个操作对象与知道怎么执行一个操作的对象分割开,实现解耦。

参考书籍:《大话设计模式》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式