首页 > 代码库 > 命令模式

命令模式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

/*


命令模式


*
* 可以对操作相关命令处理进行过滤和取消回退的操作
* (让命令和操作分开来)

*/

namespace App_MYCS.HDL_SJMS.MLMS
{
class my_MLMS
{
public void dy()
{
Receiver r = new Receiver();
Command c = new concreteCommand(r);
Invoker i = new Invoker();
i.SetCommand(c);
i.ExecuteCommand();
}
}

//执行操作接口
abstract class Command
{
protected Receiver receiver;

public Command(Receiver r)
{
this.receiver = r;
}

abstract public void Execute();
}

//把接收者对象绑定于一个动作
class concreteCommand : Command
{
public concreteCommand(Receiver r)
: base(r)
{
}

public override void Execute()
{
receiver.Action();
}
}

class Invoker
{
private Command command;

public void SetCommand(Command c)
{
this.command = c;
}
public void ExecuteCommand()
{
command.Execute();
}
}

//
class Receiver
{
public void Action()
{
Console.WriteLine("执行请求");
}
}

 


//-----------------------------------------------------------
//点菜小例

public class Barbecuer
{
//相应的操作

public void Runfunction1()
{
Console.WriteLine("执行操作1");
}

public void Runfunction2()
{
Console.WriteLine("执行操作2");
}
}

public abstract class commands
{
//抽象出
protected Barbecuer r;
public commands(Barbecuer r)
{
this.r = r;
}

abstract public void ExcuteCommand();
}

class bake1 : commands
{
public bake1(Barbecuer r)
: base(r)
{

}
public override void ExcuteCommand()
{
r.Runfunction1();
}
}

class bake2 : commands
{
public bake2(Barbecuer r)
: base(r)
{

}
public override void ExcuteCommand()
{
r.Runfunction2();
}
}

 


public class Waiter
{
private IList<commands> orders = new List<commands>();

//设置
public void Setord(commands c)
{
//增加条件进通知的 c 命令进行过滤
orders.Add(c);
}

//取消
public void CancelOrder(commands c)
{
//取消之前增加的命令
orders.Remove(c);
}

//通知全部执行
public void Notify()
{
foreach (commands c in orders)
{
c.ExcuteCommand();
}
}
}


class MLMS_dy
{
public void dy()
{
Barbecuer boy = new Barbecuer();//详细的操作

commands bakec1 = new bake1(boy);//加载命令
commands bakec2 = new bake2(boy);//

Waiter g = new Waiter();

g.Setord(bakec1);
g.Setord(bakec2);

g.Notify();

 


}
}

}

命令模式