命令模式的动机:
首先命令模式是行为型模式,这种模式注重对象之间的交互。具体到命令模式来说,它可实现命令的发送者和接收者之间的解耦。发送者和接收者没有直接的引用关系。
听起来很抽象,举个栗子:电视机有打开电视和关闭电视的功能,而打开电视和关闭电视就可以作为遥控器的命令对电视机进行调控,遥控器是命令的发送者,电视机是命令的接受者,所以不考虑设计模式的话代码可能就会这样写:
public class Tv{
public void open(){...}
public void close(){...}
}
public class Rc{
Tv tv = new Tv();
if(...){tv.open();}
if(...){tv.close();}
}
这样写的话电视机和遥控器就有很大的联系,而命令模式就是在发送者和接收者之间插入一个命令command类,实现解耦。 如图:
代码如下:
//遥控器类
class Rc{
private Command c;
public Rc(Command c){this.c = c;}
public rc(){
c.execute();
}
}
//命令接口
public interface Command {public abstract void execute();}
//具体命令实现类
class OpenCommand implements Command{
//因为该具体命令要具体执行电视机的功能,所以想办法把电视机传进来
private Tv tv;
public OpenCommand(Tv tv){this.tv = tv;}
//重写execute方法,使用传进来的tv对象调用电视机的方法
public void execute(){
tv.open();
}
}
class CloseCommand implements Command{
private Tv tv;
public CloseCommand(Tv tv){this.tv = tv;}
public void execute(){
tv.close();
}
}
//电视机类
class Tv{
public void open(){System.out.println("开电视");}
public void close(){System.out.println("关电视");}
}
//客户类
public class client{
public static void main(String [] args){
//创建电视机实例
Tv tv = new Tv();
//创建具体命令实例
OpenCommand opencommand = new OpenCommand(tv);
CloseCommand closecommand = new CloseCommand(tv);
//创建遥控器实例
RemoteControl rc = new RemoteControl(opencommand);//上转型对象
rc.rc();
}
}