本人翻译目的是用来学习Tapestry5的,共享出来希望大家批评指正。计划持续翻译。
chinajavawolf
构建管道
在
Tapestry
内的一个共通的模式是过滤管道。在这个模式下,一个存在的服务是一个使用过滤的装饰器。这个过滤器将委派给这个服务,但在调用这个方法之前有机会去改变或替换参数,并且可以在返回前执行操作。这与命令链相似,
但不同的是有两个接口
(
服务接口和过滤器接口
) ,
通过服务接口每个滤波器调用下一个过滤器。在命令链中,这个链调用每一个方法,每个必须在链中的下一个命令被调用之前返回。
服务接口和过滤器接口关系密切:过滤器接口必须匹配服务接口,但过滤器接口的每个方法必须有一个附加的参数,类型是服务接口。例如,一个管道执行字符串转换可以使用下面的接口:
- public interface StringTransformService
- {
- String transform(String input);
- }
- public interface StringTransformFilter
- {
- String transform(String input, StringTransformService delegate);
- }
- public class UpcasePreFilter implements StringTransformFilter
- {
- public String transform(String input, StringTransformService delegate)
- {
- return delegate.transform(input.toUpperCase());
- }
- }
- public class UpcasePostFilter implements StringTransformFilter
- {
- public String transform(String input, StringTransformService delegate)
- {
- return delegate.transform(input).toUpperCase();
- }
- }
PipelineBuilder
服务对构造管道有用。这个服务经常注入在一个服务构建器方法内,与有序的服务配置一起。
这个构建器完成的是表现每个在管道中的过滤器作为这个服务接口的一个实例。
这个
bridge
被
PipelineBuilder
服务创建。这个
terminator
必须被提供。
bridge
和
terminator
实现了这个服务接口。
- public static StringTransformService build(
- @InjectService("PipelineBuilder")
- PipelineBuilder builder,
- List<StringTransformFilter> configuration,
- Log serviceLog)
- {
- StringTransformService terminator = new StringTransformService()
- {
- public String transform(String input)
- {
- return input;
- }
- };
- return builder.build(log,
- StringTransformService.class, StringTransformFilter.class,
- configuration,
- terminator);
- }
这里我们创建
terminator
给管道作为一个内建类的实例,并且提供给构建器。这个结果是一个新的服务压缩成整个管道。当没有过滤器时,这就是
terminator
。