浅谈设计模式之命令模式

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

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

UML图如下:

浅谈设计模式之命令模式_第1张图片

//声明执行操作的接口
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 commands = new List();
    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. 可以把请求一个操作对象与知道怎么执行一个操作的对象分割开,实现解耦。

参考书籍:《大话设计模式》

你可能感兴趣的:(浅谈设计模式,设计模式)