命令模式用得比较少,一般都是在实际项目开发的后发现需要用的时候我们通过重构来实现。在现实生活中,我们也用这个设计模式;例如:咱们去餐馆点菜的时,服务员美眉会给我们简绍些好吃的菜,若点菜时,厨房没有了会提示我们;吃饭到中途时,菜多可撤销、菜少可添加。我们不需要关心具体是哪个大厨炒菜。这个就是我们今天要讲的设计模式----命令模式。
将一个请求封装成一个对象,从而使得你可用不同的请求对客户需求进行参数化,对请求排队或者记录日志;以及支持可撤销的操作。
我们来看看命令类(Command),命令应是命令谁做啥事。所以,我们在命令类中需要定义一个接受者的对象:
abstract class Command { //在这个地方定义一个接受者,并且后续继承中执行对应的方法 protected Receiver receiver; public Command(Receiver receiver) { this.receiver=receiver; } abstract void Execute(); } class ConcreteCommand:Command { public ConcreteCommand(Receiver receiver):base(Receiver receiver) {} public override void Execute() { //执行命令,则是转到执行接受者对象 对应的命令 receiver.Action(); } }
服务员需要收集请求,然后并命令厨师炒菜;
class Invoker { //针对项目的实际需要,我们可以定义成一个list ,可以增加、删除等 private Command command; public void SetCommand(Command command) { this.command=command; } public void ExecuteCommand() { //若为一组命令,则循环调用并执行 command.Execute(); } }
命令厨师炒菜,那么厨师本身的任务就是执行炒菜;至于怎么炒菜由厨师自己掌控;
class Receiver { public void Action() { Console.WriteLine("根据用户的需要执行,对象的操作!"); } }
客户端代码:
static void Main(string[] arg)
{
Receiver receiver=new Receiver();
Invoker invoker=new Invoker();
//具体的命令,带有命令谁做啥
ConcreteCommand concretecommand=new ConcreteCommand(receiver);
//1.先负责接收命令
invoker.SetCommand(concretecommand);
//2.通知接收者进行对应的操作
invoker.ExecuteCommand();
}
代码无高深之处,仅供和大家一起学习使用。
时间: 2024-10-17 02:33:00