命令模式
一、概念
①什么是命令模式
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对讲求排队或记录请求日期,以及支持可撤销的操作。
②为什么使用命令模式
1.能够容易的将命令写入日志,加入新的具体命令类比较容易2.可以容易的实现对请求的撤销和重做。3.将一个操作的对象与知道怎么执行一个操作的对象分开。
③如何使用命令模式
在具体命令类的方法里面调用执行者,而在请求者的方法里面调用具体命令类。实现行为请求者与行为实现者之间的解耦。
类图
实例
类图
代码
客户端
static void Main(string[] args)
{ //开店前的准备 :烤肉厨师,烤肉菜单,服务员
Barbecuer boy = new Barbecuer(); //通过Barbecuer类实例化一个boy对象,即烤肉者
Command bakeMuttonCommand1 = new BakeMuttonCommand(boy); // 多态的体现:实例化烤羊肉串对象
Command bakeMuttonCommand2 = new BakeMuttonCommand(boy); //通过command类,实例化一个烤羊肉串命令2对象,并将值赋予给对象
Command bakeChickenWingCommand1 = new BakeChickenWingCommand(boy); //通过command类,实例化一个烤翅命令1对象
Waiter girl = new Waiter(); //实例化一个服务员
//开门营业 顾客点菜
girl.SetOrder(bakeMuttonCommand1); //设置订单,服务员接受命令
girl.SetOrder(bakeMuttonCommand2); //记录所有菜点
girl.SetOrder(bakeChickenWingCommand1);
//点菜完闭,通知厨房
girl.Notify(); //服务员一次性通知烤肉厨师执行
Console.Read();
}
服务员
public class Waiter
{
//private Command command;
设置订单
//public void SetOrder(Command command )
//{
// this.command = command;
//}
通知执行
//public void Notify()
//{
// command.ExcuteCommand();
//}
//---------------------------------------------------------------------------
private IList<Command> orders = new List<Command >();//增加存放具体命令得容器
//设置订单
public void SetOrder(Command command )
{
if (command.ToString() =="命令模式_烤羊肉串02.BakeMuttonCommand " ) //如果命令为烤翅命令
{
Console.WriteLine("服务员:鸡翅没有了,请点别的烧烤"); //服务员告知没有鸡翅了
}
else //
//将命令添加到总订单中
{
orders.Add(command);
Console.WriteLine("增加订单:" + command.ToString() + "时间:"+DateTime.Now.ToString()); //记录具体时间
}
}
//取消订单
public void CancelOrder(Command command)
{
orders.Remove(command);
Console.WriteLine("取消订单:" + command.ToString() + "时间:" + DateTime.Now.ToString());
}
//通知全部执行
public void Notify() //根据用户点好得烧烤订单通知厨房制作
{
foreach (Command cmd in orders ) //遍历整个订单,并通知接受者
{
cmd.ExcuteCommand();
}
}
}
烧烤者
//烤羊肉串者
public class Barbecuer
{
//烤羊肉串
public void BakeMutton()
{
Console.WriteLine("烤羊肉串");
}
//烤鸡翅
public void BakeChickenWing()
{
Console.WriteLine("烤鸡翅");
}
}
抽象命令类
//抽象命令
public abstract class Command
{
protected Barbecuer receiver; //引用烤肉者,因为命令是烧烤者的
public Command (Barbecuer receiver )
{
this.receiver = receiver; //命令构造函数,所传参数为烧烤者
}
//执行命令
abstract public void ExcuteCommand(); //创建一个抽象执行命令方法
}
具体命令类
//烤羊肉命令类
class BakeMuttonCommand:Command //烤羊类命令继承命令
{
public BakeMuttonCommand (Barbecuer receiver ):base(receiver ) //子类构造函数与父类构造函数参数的引用
{
}
public override void ExcuteCommand() //重写父类中的执行命令方法
{
receiver.BakeMutton(); //接受者只想烤羊肉命令
}
}
//烤鸡翅命令
class BakeChickenWingCommand:Command //烤鸡翅类命令继承命令
{
public BakeChickenWingCommand (Barbecuer receiver ):base(receiver ) //构造函数的继承
{ }
public override void ExcuteCommand() //重写父类只想命令方法
{
receiver.BakeChickenWing(); //接收者实现烤鸡翅命令
}
}