命令模式
1.定义
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数话,对请求排队或者记录请求日志,以及支持可撤销的操作。
2.示例代码
使用命令模式模拟开机,机箱尚的按钮相当于命令对象,主板相当于接收者,机箱相当于Invoker要求按钮命令对象执行开机请求。
/*主板接口*/ public interface MainBoard{ //主板具有开机功能 public void open(); } /*技嘉主板,开机命令真正实现者*/ public class GAMainBoard implements MainBoard{ //真正开机命令实现 System.out.println("技嘉主板现在正在开机,请稍后"); System.out.println("接通电源..."); System.out.println("检查设备..."); System.out.println("装载系统..."); System.out.println("机器正常运转起来..."); System.out.println("机器已经正常打开,请操作"); }
/*命令接口*/ public interface Command{ public void execute(); } /*开机命令实现*/ public class OpenCommand implements Command{ //持有真正命令接收者,主板对象 private MainBoard mainBoard = null; public OpenCommand(MainBoard mainBoard){ this.mainBoard = mainBoard; } //对于命令对象,转调主板对象的开机操作 public void execute(){ this.mainBoard.open(); } } /*机箱触发命令对象发起开机请求*/ public class Box{ //开机命令对象 private Command openCommand; public void setOpenCommand(Command openCommand){ this.openCommand = openCommand; } /*提供用户使用,接收并响应用户请求,相当于按钮被按下,触发方法*/ public void openButtonPressed(){ openCommand.execute(); } }
/*客户开机操作*/ public class Client{ public static void main(String args[]){ //1.装配开机对象 MainBoard mainBoard = new GAMainBoard(); Command openCommand = new OpenCommand(mainBoard); //2.为机箱上的按钮设置相应的命令 Box box = new Box(); box.setOpenCommand(openCommand); //3.按下开机按钮 box.openButtonPressed(); } }
3.实际应用
命令模式的关键之处就是把请求封装成对象,也就是命令对象,并定义了统一的执行操作接口,这个命令对象可以被存储,转发,记录,处理,撤销等,整个命令模式都是围绕这个命令对象在进行。
命令模式的本质:封装请求