原创作者: chinajavawolf   阅读:1194次   评论:0条   更新时间:2011-05-26    
本人翻译目的是用来学习Tapestry5的,共享出来希望大家批评指正。计划持续翻译。
chinajavawolf  
命令链
 
命令模式是四人帮设计模式(Gang Of Four Design Patterns)中非常有用的设计模式之一。
 
使用命令模式,一个复杂的过程被分解成多个单独的步骤。这个步骤就是命令模式中的命令。一个关键部分是这个命令被期望实现某些通用接口。这些命令被非常小心的分派给特定顺序。
 
这个过程运转是通过在命令列表下工作的。每个命令被一个操作机会。一个命令通过抛出一个异常或返回一个true来结束这个过程。
 
命令方法返回的类型不用必须是boolean型:对于对象类型,任何非null值短路过程。例如数字类型,任何非零值。对于void方法,仅是抛出异常将短路这个过程。
 
通常,这个命令接口由一个单独的方法组成。当这个命令接口有多个方法时,每个都能被考虑成作为它自己的链。
 
这是一种有用的模式,因为这样做很容易把某个过程仅仅通过提供新的命令并指定他们适合整个过程的位置。最常用的指挥链结合有序配置,以指定命令列表是什么 (并且它们应该以什么顺序执行)
 
ChainBuilder 服务
 
因为这个模式在Tapestry内经常被使用,因为需要一个内建的服务存在以创建这个模式的实现。ChainBuilder服务负责所有的工作: 
  1. public interface ChainBuilder   
  2. {   
  3.  <T> T build(Class<T> commandInterface, List<T> commands);   
  4. }   
  5.    
所有泛化的参数仅仅是确保命令的接口匹配列表中的项目,并且确定一个唯一的命令接口实例将被返回。
 
调用这个方法返回一个压缩在命令链中的对象给特定的接口和特定的那个接口的实现命令列表。
 
这可以被用在一个服务构建器方法内。决不是说构建器方法紧紧必须实例化一个类;它仅要求返回一个适当的对象。我们可以通过ChainBuilder服务创建那个对象。 
  1. public static MyChainService build(List<MyChainService> commands,   
  2.    @InjectService("ChainBuilder")   
  3.    ChainBuilder chainBuilder)   
  4. {   
  5.     return chainBuilder.build(MyChainService.class, commands);   
  6. }  
这里,MyChainService的行为通过他的配置被定义:通过一个或更多个模块贡献一个MyChainService命令的有序列表。
 
在内部,ChainBuilder创建了一个实现了这个服务接口的新的类。命令列表被转换成一个array,被用在服务实现中(为最大的效率)。因此,在创建这个链实例后改变这个列表将不会影响这个链实例的行为。
 
ChainBuilder将会为很多实现了同一命令接口的链而重新使用这个构成的类。
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

文章信息

Global site tag (gtag.js) - Google Analytics