命令模式 -- Command

2017-04-05 08:44:05   最后更新: 2017-04-05 08:46:02   访问数量:499




命令模式将一个请求封装成一个对象,从而让你可以用不同的请求对客户进行参数化,或者将请求排队或者记录日志,以及可以支持可撤销的操作

有时,任务的执行者并不知道该进行什么操作,只有调用者才知道,典型的是一个菜单,菜单中的所有选项都继承自一个抽象的 MenuItem 接口,实现其 excute 操作,只有当用户点击某个菜单项时,MenuItem 才调用具体的某个菜单项类的 excute 方法,实现对该消息的响应

但是,paste 菜单项与 open 菜单项接收的参数是显然不同的,paste 操作向一个文档粘贴正文,至少需要传入一个文档参数,而 open 菜单项则讲一个路径中存在的文档打开,因此需要一个文档路径作为参数

有时,我们还需要依次调用多个 MenuItem 类

上面的例子就是 Command 模式的一个典型的例子,这样,应用如果需要一个新的菜单项,只需要动态增加或替换 Command 对象即可

 

Command 模式用于以下场景中:

  1. 抽象出待执行动作以参数化某对象,对象的操作被看成回调函数,在某个时候被调用
  2. 请求会在不同时刻指定、排列和执行
  3. 在具体动作执行前支持取消、重做操作,Command 对象有时需要实现 unexecute 操作,来支持上一次 execute 操作调用时产生的效果
  4. 事务系统的实现,一个事务封装了一组变动,每个变动单独执行,拥有 execute 与 unexecute 操作,当某个动作执行失败,则调用者调用全体执行者的 unexecute 方法实现事务的回滚

 

 

 

如上图所示,Command 模式主要由下列组件构成:

  1. Command -- 声明执行操作的抽象接口
  2. ConcreteCommand -- Command 的具体实现类,讲一个接收者对象绑定到一个动作,通过调用具体某个接收者的 action 操作实现 execute 操作
  3. Invoker -- 调用具体的 ConcreteCommand 实现请求命令的执行
  4. Receiver -- 知道如何实施与执行一个请求相关的操作

 

 

 

Command 模式有以下优点:

  1. 实际的操作对象与调用者解耦
  2. 可以实现多命令复合命令
  3. 增加新的 Command 类非常容易,无改变任何已有的类

 

Command 本质是对象到操作的抽象,java8 提供的函数接口可以很方便的实现一个 Command 模式类

java8 新特性

 






技术帖      龙潭书斋      command      java      jdk      面向对象      oop      设计模式      java8      design pattern      命令模式      回调      callback      面向过程     


京ICP备15018585号