您的位置:首页 > 其它

命令模式(Command)

2009-12-13 14:16 239 查看

重要概念





1.命令抽象类,也是命令模式的核心理解





2.命令模式能较容易的设计一个命令队列,在需要的情况下,可以容易地将命令计入日志,并允许接收请求的一方可以判断否决掉请求。

3.可以容易的实现对请求的撤销和重做。

4.由于加进新的具体命令类不影响其他的类,因此添加新的具体命令类很容易。

5.命令模式把请求一个操作的对象与指导怎么执行的操作的对象通过命令对象分割开.

示例代码

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;

namespace命令模式
{
classProgram
{
staticvoidMain(string[]args)
{
Receiverr=newReceiver();
Commandc=newConcreteCommand(r);
Invokeri=newInvoker();

//Setandexecutecommand
i.SetCommand(c);
i.ExecuteCommand();

Console.Read();

}
}

abstractclassCommand
{
protectedReceiverreceiver;

publicCommand(Receiverreceiver)
{
this.receiver=receiver;
}

abstractpublicvoidExecute();
}

classConcreteCommand:Command
{
publicConcreteCommand(Receiverreceiver):base(receiver){}

publicoverridevoidExecute()
{
receiver.Action();
}
}

classReceiver
{
publicvoidAction()
{
Console.WriteLine("执行请求!");
}
}

classInvoker
{
privateCommandcommand;

publicvoidSetCommand(Commandcommand)
{
this.command=command;
}

publicvoidExecuteCommand()
{
command.Execute();
}
}

}
羊肉串第三版
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;

namespace命令模式
{
classProgram
{
staticvoidMain(string[]args)
{
//开店前的准备
Barbecuerboy=newBarbecuer();
CommandbakeMuttonCommand1=newBakeMuttonCommand(boy);
CommandbakeMuttonCommand2=newBakeMuttonCommand(boy);
CommandbakeChickenWingCommand1=newBakeChickenWingCommand(boy);
Waitergirl=newWaiter();

//开门营业顾客点菜
girl.SetOrder(bakeMuttonCommand1);
girl.SetOrder(bakeMuttonCommand2);
girl.SetOrder(bakeChickenWingCommand1);

//点菜完闭,通知厨房
girl.Notify();

Console.Read();

}
}

//服务员
publicclassWaiter
{
privateIList<Command>orders=newList<Command>();

//设置订单
publicvoidSetOrder(Commandcommand)
{
if(command.ToString()=="命令模式.BakeChickenWingCommand")
{
Console.WriteLine("服务员:鸡翅没有了,请点别的烧烤。");
}
else
{
orders.Add(command);
Console.WriteLine("增加订单:"+command.ToString()+"时间:"+DateTime.Now.ToString());
}
}

//取消订单
publicvoidCancelOrder(Commandcommand)
{
orders.Remove(command);
Console.WriteLine("取消订单:"+command.ToString()+"时间:"+DateTime.Now.ToString());
}

//通知全部执行
publicvoidNotify()
{
foreach(Commandcmdinorders)
{
cmd.ExcuteCommand();
}
}
}

//抽象命令
publicabstractclassCommand
{
protectedBarbecuerreceiver;

publicCommand(Barbecuerreceiver)
{
this.receiver=receiver;
}

//执行命令
abstractpublicvoidExcuteCommand();
}

//烤羊肉串命令
classBakeMuttonCommand:Command
{
publicBakeMuttonCommand(Barbecuerreceiver)
:base(receiver)
{}

publicoverridevoidExcuteCommand()
{
receiver.BakeMutton();
}
}

//烤鸡翅命令
classBakeChickenWingCommand:Command
{
publicBakeChickenWingCommand(Barbecuerreceiver)
:base(receiver)
{}

publicoverridevoidExcuteCommand()
{
receiver.BakeChickenWing();
}
}

//烤肉串者
publicclassBarbecuer
{
publicvoidBakeMutton()
{
Console.WriteLine("烤羊肉串!");
}

publicvoidBakeChickenWing()
{
Console.WriteLine("烤鸡翅!");
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: