1,为什么要使用命令设计模式
当我们有一台多功能的打印机,然后通过电脑直接进行任务,如图
如果通过这样的设计直接去调用多功能一体机的功能,就会存在此时此刻只能进行一个任务,不允许有多个客户端同时操作.
2,什么是命令设计模式
那么现在我们就需要考虑一种新的设计模式,叫做命令设计模式。
命令设计模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以支持可撤销操作.
3,怎么使用命令设计模式
按照设计模式的概念将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,我们有必要去写一个命令的接口,下面继承各类命令。对请求排队或记录请求日志,以
支持可撤销操作.我们需要去写一个服务类与命令聚合,这样我们只需要调用服务类就可以执行命令,然后通过命令去执行一体机的操作.
UML如下:
按照这样的设计有如下几点好处:
1,可以较为容易设计一个命令队列
2,在需要情况下可以较容易地将命令记入日志
3,允许接收请求的一方决定是否要否决请求
4,可以容易地实现对请求的撤销和重做
5,增加命令类操作遵守了开闭原则
6,命令模式把请求一个操作对象与指导怎么执行一个操作的对象分隔开
源代码:
多功能一体机.class
public class 多功能一体机 {
public void 复印(){
System.out.println("复印执行");
}
public void 打印(){
System.out.println("打印执行");
}
public void 传真(){
System.out.println("传真执行");
}
}
命令.class
public interface 命令 {
public void 执行命令(多功能一体机 machine);
}
打印.class
public class 打印 implements 命令{
@Override
public void 执行命令(多功能一体机 machine) {
// TODO Auto-generated method stub
machine.打印();
}
}
传真.class
public class 传真 implements 命令{
@Override
public void 执行命令(多功能一体机 machine) {
// TODO Auto-generated method stub
machine.传真();
}
}
复印.class
public class 复印 implements 命令{
@Override
public void 执行命令(多功能一体机 machine) {
// TODO Auto-generated method stub
machine.复印();
}
}
多功能一体机服务程序.class
public class 多功能一体机服务程序 {
private ArrayList<命令> 任务列表 = new ArrayList<命令>();
private 多功能一体机 machine = null;
public 多功能一体机服务程序(多功能一体机 machine){
this.machine = machine;
}
public void 加入任务(命令 cmd){
任务列表.add(cmd);
}
public void 移除任务(命令 cmd){
任务列表.remove(cmd);
}
public void 执行任务(){
for(命令 cmd :任务列表){
cmd.执行命令(machine);
}
}
}
Main.class
public class Main {
public static void main(String[] args){
多功能一体机 多功能一体机 = new 多功能一体机();
多功能一体机服务程序 多功能一体机服务程序 = new 多功能一体机服务程序(多功能一体机);
复印 复印 = new 复印();
打印 打印 = new 打印();
传真 传真 = new 传真();
多功能一体机服务程序.加入任务(复印);
多功能一体机服务程序.加入任务(打印);
多功能一体机服务程序.加入任务(传真);
多功能一体机服务程序.移除任务(打印);
多功能一体机服务程序.执行任务();
}
}
最后输出:
复印执行
传真执行