我在设计一个UI时,采用了模版引擎实现,为了隔绝和各模版引擎实现的依赖性,我对模版引擎进行了包装,抽象出一层接口层:
Template
- public interface Template {
- public void merge(Context context)throws MergeException;
- }
Context
java 代码
- public interface Context {
- public void clear();
- public abstract Writer getOut();
- public Object get(String key);
- public void put(String key,Object value);
- }
TemplateEngine
java 代码
- public interface class TemplateEngine{
- public void mergeTemplate(String templateName, Context context,
- Writer pWriter) throws MergeException;
- public abstract void mergeTemplate(Template template,
- Context context) throws MergeException;
- }
但是在各个实现包里却出现了一个非常晦涩的问题:
VelocityTemplateImpl
java 代码
- public class VelocityTemplate implements org.jwebap.ui.template.Template {
- private org.apache.velocity.Template _template=null;
- public CTLTemplate(org.apache.velocity.Template template){
- _template=template;
- }
- public void merge(Context context) throws MergeException {
- Writer writer=context.getOut();
- if(!context instanceof VelocityContext){
- throw new ClassCastException("...");
- }
- ...;
- }
- }
按照接口语义,对于传进来的任何Context实现,应该都能处理,但是这里确不得不判断是不是一个VelocityContext。
java 代码