设计模式 命令模式 Command
原创
©著作权归作者所有:来自51CTO博客作者朋克版小红帽的原创作品,请联系作者获取转载授权,否则将追究法律责任
命令模式 把 行为请求者 与行为实现者 解耦
现实例子 我们生活里 老师委派学委来收作业 我们来实现这个代码的时候 可能会是在老师类里 new 一个学委 来实现他收作业的方法 但是如果 学委不在老师要指派别的学生来收作业 这就要改动代码 我们也不能把 这个临时的学生 new 成学委 或者职务发生变化 成为临时学委
万能遥控器 与多台电视 我只发送命令 是谁来接受 万能遥控器不用去考虑
Command 命令模式 设计图
Invoker 请求者
Receiver 接受者
Command 命令接口
ConcreteCommand 命令接口实现对象
我们按照电视机 栗子
电视本身就具有关机 开机 换台功能
public class TV
{
public int num = 0;
public TV()
{
}
public void NO()
{
Console.WriteLine(" 关闭");
}
public void off()
{
Console.WriteLine(" 开启");
}
public void change( int _num)
{
this.num = _num;
Console.WriteLine("换台到 " + num);
}
}
命令接口
interface ICommand
{
void execute();
}
各种命令实现接口
命令 直接对应实体类 这样发送命令端 和接受端 解耦
老师 我只要发命令 至于是谁去实现她不用管 都是命令这个些类的接受的对象来实现
class NoCommand:ICommand
{
private TV tv;
public NoCommand(TV _tv)
{
tv = _tv;
}
public void execute()
{
tv.NO();
}
}
class offCommand:ICommand
{
private TV tv;
public offCommand(TV _tv)
{
this.tv = _tv;
}
public void execute()
{
tv.off();
}
}
public class ChangeCommand:ICommand
{
private TV tv;
private int num;
public ChangeCommand(TV _tv, int _num)
{
this.tv = _tv;
this.num = _num;
}
public void execute()
{
tv.change(num);
}
}
控制类 invoker
class Control
{
private ICommand nocommand, offcommand, changecommand;
public Control(ICommand _nocommand, ICommand _offcommand, ICommand _changecommand)
{
nocommand = _nocommand;
offcommand = _offcommand;
changecommand = _changecommand;
}
public void off()
{
offcommand.execute();
}
public void no()
{
nocommand.execute();
}
public void change()
{
changecommand.execute();
}
}
public MainWindow()
{
InitializeComponent();
int num = 2;
TV tv = new TV();
NoCommand no = new NoCommand(tv);
offCommand off = new offCommand(tv);
ChangeCommand change = new ChangeCommand(tv, num);
Control control = new Control(no,off,change);
control.off();
control.no();
control.change();
}