(将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。)
在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。
命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求,这就是命令模式的动机。
例如: 当我们进行电脑开机时,我们只需要按下开机键也就是发送开机命令,不管我们用的台式机还是笔记本、惠普的还是联想的,,我们只需要知道开机命令并且发送它,具体谁执行开机命令我们并不关心。
定义主板:
public interface MainBoard { public void open); }
定义主板实现类:
1 public class GigaMainBoard implements MainBoard { 2 3 @Override 4 public void open) { 5 System.out.println"主板正在开机..."); 6 System.out.println"机器已经正常打开,请操作..."); 7 } 8 9 }
定义命令接口:
public interface Command { public void excute); }
定义命令的具体实现类:
1 /** 2 * 持有真正实现命令的接收者----主板对象 3 * @author Administrator 4 * 5 */ 6 7 8 public class OpenCommand implements Command { 9 10 private MainBoard mainboard = null; 11 /* 12 * 构造方法,传入主板对象 13 */ 14 15 public OpenCommandMainBoard mainboard) { 16 super); 17 this.mainboard = mainboard; 18 } 19 20 21 @Override 22 public void excute) { 23 //对于命令对象,根本不知道如何开机,回转调主板对象 24 //让主板去完成开机的功能 25 this.mainboard.open); 26 } 27 28 }
提供机箱:
1 public class Box { 2 /** 3 *开机命令对象 4 */ 5 private Command opencommend; 6 /** 7 * 设置开机命令对象 8 */ 9 public void setOpencommendCommand opencommend) { 10 this.opencommend = opencommend; 11 } 12 /** 13 * 提供给客户使用,接收并响应用户请求,相当于按钮被按下的触发方法 14 */ 15 public void openButtonPressed) { 16 //按下按钮,执行命令 17 opencommend.excute); 18 } 19 20 }
客户测试:
1 public class CommandPattern { 2 3 public static void mainString[] args) { 4 //1.把命令和真正的实现组合起来,相当于在组装机器 5 //把机箱上按钮的连接线插接到主板上 6 7 //定义主板 8 MainBoard mainBoard = new GigaMainBoard); 9 //定义开机命令,为开机命配备具体主板 10 OpenCommand openCommand = new OpenCommandmainBoard); 11 12 //2.为机箱上的按钮设置对应的命令,让按钮知道该干什么 13 14 //定义机箱(开机按钮) 15 Box box = new Box); 16 //为机箱设置开机命令 17 box.setOpencommendopenCommand); 18 19 //3.然后模拟按下机箱上的按钮 20 box.openButtonPressed); 21 } 22 23 24 /* 25 * 在客户测试步骤中我们可以发现,机箱与主板并无直接的关系,中间由开机命令链接 26 * 机箱只知道可以机箱发送开机的命令有对象去执行,不需要知道执行命令的主板是哪个 27 */ 28 }
运行结果:
主板正在开机...
机器已经正常打开,请操作...
惠普的还是联想的,
[Huìpǔ de háishì liánxiǎng de,]
HP or Lenovo,