1,说一下什么是命令模式
答:命令模式是一种行为型的设计模式,为了实现请求者和接收者(执行者)的解耦,将请求的调用封装成一个命令对象,由命令对象来通知并让接收者完成相应的任务。
2,命令模式有哪几个关键对象
答:命令模式中主要包含了三个对象:
“命令类”--订单(也就是实现统一命令接口的命令),
“执行者”--厨师(也就是真正执行命令的人),
“命令调用者”--服务员(进行命令传递的人)
3,举个例子解释一下
这里应该先配一张图
答:先说一下原来的开发方式,传统的方法调用就是直接调用,比如:客户让厨师做一个汉堡,那么他需要新建一个厨师对象,然后调用该对象的创建汉堡,如下
// 厨师类
public Class 厨师 {
public void 创建汉堡(){
System.out.print("做了一个汉堡");
}
}
// 客户类
public Class 客户 {
public static void main(String[] args){
厨师 厨师对象 = new 厨师();
厨师对象.创建汉堡();
}
}
命令模式就是将 “客户让厨师做一个汉堡”,中的“让厨师做一个汉堡”封装成一个命令,然后交给服务员(也就是命令调用类)去处理,也就变成了 “客户(请求者)告诉服务员(命令调用类)他的订单:让厨师做一个汉堡(命令对象),然后服务员(命令调用类)告知厨师(接收者(执行者))这个订单(命令对象)”,具体实现如下
// 厨师类(接收者/执行者)
public class 厨师 {
public void 创建汉堡(){
System.out.print("做了一个汉堡");
}
}
// 订单(命令对象的接口)
public interface 订单 {void 执行();}
// 创建汉堡的命令(命令对象的实现)
public class 创建汉堡 implements 订单 {
private 厨师 厨师对象; // 厨师对象(接收者/执行者)
创建汉堡(厨师 厨师对象){ // 构造方法
this.厨师对象 = 厨师对象;
}
public void 执行(){
this.厨师对象.创建汉堡();
};
}
// 服务员类(命令调用者)
public class 服务员 {
List<订单> 订单数组 = new List<订单>();
public void 点菜(订单 订单对象) {
订单数组.add(订单对象);
}
public void 提交订单() {
for(订单 单个订单:订单数组) {
单个订单.执行();
}
订单数组.clear();
}
}
// 客户类
public class 客户 {
public static void main(String[] args){
// 想要一个汉堡:原来的方式
// 厨师 厨师对象 = new 厨师();
// 厨师对象.创建汉堡();
// 想要一个汉堡:现在的方式
服务员 服务员对象 = new 服务员();
厨师 厨师对象 = new 厨师();
创建汉堡 创建汉堡命令 = new 创建汉堡(厨师对象);
服务员对象.点菜(创建汉堡命令);
服务员对象.提交订单(); // 这时汉堡就出来了
}
}
4,命令模式所关注的点是什么呢
答:传统方式中,客户想要汉堡,那么他需要知道厨师对象中有创建汉堡的方法,而命令模式的是实现是,客户不再关心厨师对象内部有什么方法,客户只需要知道菜单上有个创建汉堡的命令,然后告诉服务员我需要调用这个命令即可。
简单说就是,原先调用方法需要创建对象来执行方法,而现在可以直接将方法丢出,让其他程序来帮忙执行方法,降低代码耦合度
5,用于实践的命令模式
应用于实践的地方有很多,比如
1,消息通道或者消息队列
当大量的命令需要执行,但是这些命令又对时限没有要求,此时通过消息队列来传递命令对象,再由固定数量的线程来接收并执行相应的命令,此时线程并不需要了解命令对象所执行的操作内容。这是典型的命令模式。
2,事务的处理
在我们进行事务处理时,经常做的操作就是,将一组命令提交到事务组,再由事务统一提交执行,这就是将命令统一提交执行。