命令模式  把 行为请求者 与行为实现者 解耦

现实例子 我们生活里 老师委派学委来收作业  我们来实现这个代码的时候 可能会是在老师类里 new 一个学委 来实现他收作业的方法  但是如果 学委不在老师要指派别的学生来收作业 这就要改动代码 我们也不能把 这个临时的学生 new 成学委 或者职务发生变化 成为临时学委

设计模式 命令模式 Command_命令模式

万能遥控器 与多台电视 我只发送命令 是谁来接受 万能遥控器不用去考虑

Command 命令模式 设计图

设计模式 命令模式 Command_设计模式_02

 

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();

}

 

 

设计模式 命令模式 Command_设计模式_03