命令(Command)模式:指将请求封装为一个对象,从而使发出请求的动作与请求执行的动作分开。二者之间通过对象进行沟通,这样就可以很方便的将命令对象存储,传递和调用。
优点:
- 通过引入中间件的方式,降低系统的耦合度
- 可以很方便的实现Undo和Redo操作。
缺点:
- 可能产生大量的具体命令类
- 引入额外的类结构,增加了系统理解的难度
示例:假设有一个编辑器,它具有创建和删除两个功能
static class Editer{
public void create(){
System.out.println("创建一个对象");
}
public void delete(){
System.out.println("删除一个对象");
}
}
正常情况下,它将被这样调用
public static void main(String[] args) {
Editer editer = new Editer();
editer.create();
editer.delete();
}
但如果我们改用命令模式,将请求的动作和执行的操作分开,则可以引入一个Command接口
interface Command{
void execute();
}
然后创建对应的Command,然后执行,并不关心具体是如何实现的
static class CreateCommand implements Command{
// 持有被执行的对象
private Editer editer;
public CreateCommand(Editer editer){
this.editer = editer;
}
@Override
public void execute() {
editer.create();
}
}
static class DeleteCommand implements Command{
// 持有被执行的对象
private Editer editer;
public DeleteCommand(Editer editer){
this.editer = editer;
}
@Override
public void execute() {
editer.delete();
}
}
测试
public static void main(String[] args) {
Editer editer = new Editer();
// 执行创建命令
CreateCommand createCommand = new CreateCommand(editer);
createCommand.execute();
// 执行删除命令
DeleteCommand deleteCommand = new DeleteCommand(editer);
deleteCommand.execute();
}
到此为止,可以发现命令模式貌似反而让系统复杂度更高了,还不如直接调用来的简单直接。
但是,具体情况需要视需求而定,比如Editer功能类很复杂,并且需要支持Undo和Redo功能呢?此时就可以使用命令模式
不难发现,设计模式带来的系统复杂度会随着系统复杂度增加的,它主要减少的是系统耦合度