一、什么是命令略模式
请求对象化,,以便可记录可撤销
将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
将请求包装进命令中,并传给调用对象,调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
UML图
Receiver接收器类,里面包含执行方法,等待命令类调用.
Command:命令类,有一个执行方法
ConcreteCommand:具体执行类依赖接收器,统一执行操作 接收器里面声明的方法.
Invoker: 请求者类,发布命令,记录命令,可执行,撤销命令,对命令做统筹管理
二、适用场景
需要发布指令,亦可撤销指令的情况,比如餐饮下单,比如 遥控器换台, 开关电灯.命令模式最.
三、优缺点
优点
解耦合,将命令的声明与执行分开,调用者与接收者解耦合.
请求内容可操作性强,可记录,增加,撤销等
命令模块可以方便扩展
很容易设计一个命令队列
接收方可以判断是否接受命令
缺点
命令模式Command的子类会以命令的个数而存在,可能会非常庞大。
四、大话中的例子
烧烤店,顾客下单点烤羊肉串,烤鸡翅的命令,请求类需要将这些命令几率下来,然后可执行,将命令发送给执行者。执行者类有烤肉,烤鸡翅,烤鸡腿等方法,命令类有一个执行方法,具体命令类,依赖执行者类,自身的操作方法其实是调用执行者类对应的方法。接收者类接受不同的命令,下达执行命令。
五、我的例子
using System;
namespace CommandMode
{
class Program
{
static void Main(string[] args)
{
Nnjutsu nnjutsu = new Nnjutsu();
Mudras mudras = new Mudras(new Command[] { new Chou(nnjutsu), new Xu(nnjutsu), new Chen(nnjutsu), new Zi(nnjutsu), new Xu(nnjutsu), new Hai(nnjutsu), new Si(nnjutsu), new Yin(nnjutsu), new JieYin(nnjutsu) });
mudras.Action();
mudras = new Mudras(new Command[] { new Wei(nnjutsu), new Si(nnjutsu), new Yin(nnjutsu), new JieYin(nnjutsu) });
mudras.Action();
}
}
class Nnjutsu
{
string mudras;
public void ShadowCopy()
{
if (mudras == "丑戌辰子戌亥巳寅")
{
Console.WriteLine("影分身之术");
}
else if (mudras == "未巳寅")
{
Console.WriteLine("身之术");
}
else if (mudras == "亥戌酉申未")
{
Console.WriteLine("通灵术");
}
mudras = "";
}
public void CreateMudras(string mudra)
{
mudras += mudra;
}
}
class Mudras
{
Command[] commands;
public Mudras(params Command[] commands)
{
this.commands = commands;
}
public void Action()
{
foreach (var item in commands)
{
item.Excute();
}
}
}
abstract class Command
{
protected Nnjutsu nnjutsu;
public Command(Nnjutsu nnjutsu)
{
this.nnjutsu = nnjutsu;
}
public abstract string Excute();
}
class Zi : Command
{
public Zi(Nnjutsu nnjutsu) : base(nnjutsu)
{
}
public override string Excute()
{
nnjutsu.CreateMudras("子");
return "子";
}
}
class Chou : Command
{
public Chou(Nnjutsu nnjutsu) : base(nnjutsu)
{
}
public override string Excute()
{
nnjutsu.CreateMudras("丑");
return "丑";
}
}
class Yin : Command
{
public Yin(Nnjutsu nnjutsu) : base(nnjutsu)
{
}
public override string Excute()
{
nnjutsu.CreateMudras("寅");
return "寅";
}
}
class Mao : Command
{
public Mao(Nnjutsu nnjutsu) : base(nnjutsu)
{
}
public override string Excute()
{
nnjutsu.CreateMudras("卯");
return "卯";
}
}
class Chen : Command
{
public Chen(Nnjutsu nnjutsu) : base(nnjutsu)
{
}
public override string Excute()
{
nnjutsu.CreateMudras("辰");
return "辰";
}
}
class Si : Command
{
public Si(Nnjutsu nnjutsu) : base(nnjutsu)
{
}
public override string Excute()
{
nnjutsu.CreateMudras("巳");
return "巳";
}
}
class Wu : Command
{
public Wu(Nnjutsu nnjutsu) : base(nnjutsu)
{
}
public override string Excute()
{
nnjutsu.CreateMudras("午");
return "午";
}
}
class Wei : Command
{
public Wei(Nnjutsu nnjutsu) : base(nnjutsu)
{
}
public override string Excute()
{
nnjutsu.CreateMudras("未");
return "未";
}
}
class Shen : Command
{
public Shen(Nnjutsu nnjutsu) : base(nnjutsu)
{
}
public override string Excute()
{
nnjutsu.CreateMudras("申");
return "申";
}
}
class You : Command
{
public You(Nnjutsu nnjutsu) : base(nnjutsu)
{
}
public override string Excute()
{
nnjutsu.CreateMudras("酉");
return "酉";
}
}
class Xu : Command
{
public Xu(Nnjutsu nnjutsu) : base(nnjutsu)
{
}
public override string Excute()
{
nnjutsu.CreateMudras("戌");
return "戌";
}
}
class Hai : Command
{
public Hai(Nnjutsu nnjutsu) : base(nnjutsu)
{
}
public override string Excute()
{
nnjutsu.CreateMudras("亥");
return "亥";
}
}
class JieYin : Command
{
public JieYin(Nnjutsu nnjutsu) : base(nnjutsu)
{
}
public override string Excute()
{
nnjutsu.ShadowCopy();
return "";
}
}
}
运行结果
PS:命令模式,命令过多不宜使用。