最近在看《headfirst设计模式》觉得是时候该整理整理一些知识了
为了浅显易懂我们把命令模式想象成一个人用遥控器换台关机的事件。
要设计命令模式,我们需要的是一个无辜的遥控器,一台自己家的电视机,然后是各种开关机换台的命令信号。
首先,我们要定义一个接口,这个接口是所有电视机信号的抽象动作
public interface Command{
public void do();
}
接下来看一看电视机的代码
public class Television{
public void on(){
System.out.println("turn on the tv");
}
public void off(){
System.out.println("turn off the tv");
}
public void up(){
System.out.println("turn up the tv");
}
public void down(){
System.out.println("turn down the tv");
}
}
然后,我们再来看一看各种开关机换台的命令信号的代码
public class TvOnCommand implements Command{
Television tv;
public TvOnCommand(Television tv){
this.tv=tv;
}
public void do(){
tv.on();
}
}
public class TvOffCommand{
Television tv;
public TvOnCommand(Television tv){
this.tv=tv;
}
public void do(){
tv.off();
}
}
public class TvUpCommand implements Command{
Television tv;
public TvOnCommand(Television tv){
this.tv=tv;
}
public void do(){
tv.up();
}
}
public class TvDownCommand implements Command{
Television tv;
public TvOnCommand(Television tv){
this.tv=tv;
}
public void do(){
tv.down();
}
}
最后,我们看一看遥控器的代码
public class Controller{
Command command;
public Controller(Command command){
this.command=command;
}
public void button(){
command.do();
}
}
这样一来,我们的命令模式所有组件就完成了,然后我们需要测试一下
public class TestCommand{
public static void main(String[] args){
Television tv=new Television();
TvUpCommand tvOn=new TvUpCommand(tv);
Controller controller=new Controller(tvOn);
controller.button();
}
}
在这里给大家稍稍说明一下流程
先定义一个具有各种操作方法的类(电视机)
接下来,我们需要几个具备发给电视机的类(命令信号) 在这个类中,我们需要*让这个信号知道他是发送到电视机的*而不是电灯空调等其他电器,所以在此我们要把电视机对象注入到这个信号中,然后再放置可以电视机的各类开关机换台操作,这样一个信号就完成了。
最后,我们定义一个可以发出信号的遥控器,这个遥控器上有按钮,但是光有按钮不行,我们还需要可以发出去的信号,所以在这里我们要把之前写好的命令信号注入到这个遥控器类当中,通过按钮来发出这个信号,完成整个流程。
以上便是命令模式,有不足的地方欢迎指正!