将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。)     

  在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。

      命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求,这就是命令模式的动机。

      例如: 当我们进行电脑开机时,我们只需要按下开机键也就是发送开机命令,不管我们用的台式机还是笔记本、惠普的还是联想的,,我们只需要知道开机命令并且发送它,具体谁执行开机命令我们并不关心。

定义主板:

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 OpenCommand(MainBoard 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 setOpencommend(Command 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 main(String[] args) {
 4 //1.把命令和真正的实现组合起来,相当于在组装机器
 5 //把机箱上按钮的连接线插接到主板上
 6         
 7 //定义主板        
 8 MainBoard mainBoard = new GigaMainBoard();
 9 //定义开机命令,为开机命配备具体主板
10 OpenCommand openCommand = new OpenCommand(mainBoard);
11 
12 //2.为机箱上的按钮设置对应的命令,让按钮知道该干什么
13 
14 //定义机箱(开机按钮)
15 Box box = new Box();
16 //为机箱设置开机命令
17 box.setOpencommend(openCommand);
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,