`
leadyu
  • 浏览: 51439 次
  • 性别: Icon_minigender_1
  • 来自: 广州,福州
文章分类
社区版块
存档分类
最新评论

一个接口设计模式的探讨

阅读更多

我在设计一个UI时,采用了模版引擎实现,为了隔绝和各模版引擎实现的依赖性,我对模版引擎进行了包装,抽象出一层接口层:

Template

  1. public interface Template {   
  2.        public void merge(Context context)throws MergeException;   
  3. }   

Context

java 代码
  1. public interface Context {   
  2.  public void clear();   
  3.   
  4.  public abstract Writer getOut();   
  5.     
  6.  public Object get(String key);   
  7.     
  8.  public void put(String key,Object value);   
  9. }   
  10.   

TemplateEngine

java 代码
  1. public interface class TemplateEngine{   
  2.   
  3.  public void mergeTemplate(String templateName, Context context,   
  4.    Writer pWriter) throws MergeException;   
  5.   
  6.  public abstract void mergeTemplate(Template template,   
  7.    Context context) throws MergeException;   
  8.   
  9. }   
  10.   

但是在各个实现包里却出现了一个非常晦涩的问题:

VelocityTemplateImpl

java 代码
  1. public class VelocityTemplate implements org.jwebap.ui.template.Template {   
  2.     
  3.  private org.apache.velocity.Template _template=null;   
  4.     
  5.  public CTLTemplate(org.apache.velocity.Template template){   
  6.   _template=template;   
  7.  }   
  8.     
  9.  public void merge(Context context) throws MergeException {   
  10.   Writer writer=context.getOut();   
  11.   if(!context instanceof VelocityContext){   
  12.    throw new ClassCastException("...");   
  13.   }   
  14.   ...;   
  15.  }   
  16.   
  17. }   
  18.   

按照接口语义,对于传进来的任何Context实现,应该都能处理,但是这里确不得不判断是不是一个VelocityContext。

java 代码
分享到:
评论
6 楼 javatar 2007-11-27  
即然要通用,你就只能取最小交集。
5 楼 leadyu 2007-11-27  
这样是不是也不太好啊,

难道Context对于外层,真的就只是个Map?
4 楼 javatar 2007-11-27  
晕没看到你自己的回复已经这样改了,还不能删除,当我没说,呵呵,
3 楼 javatar 2007-11-27  
应该将Teamplate和Context都隐藏,只暴露TemplateEngine作为通用接口,所有传入参都用JDK中已有的常规类,
如:
public interface TemplateEngine {   
  
    public void mergeTemplate(String templateName, Map model, Writer out) throws MergeTemplateException;   
  
}


然后,每种模板引擎都实现:

public interface VelocityTemplateEngine {
	public void mergeTemplate(String templateName, Map model, Writer out) throws MergeTemplateException {
		VelocityContext...
		VelocityTemplte...
	}
}


public interface CommonTemplateEngine {
	public void mergeTemplate(String templateName, Map model, Writer out) throws MergeTemplateException {
		org.commontemplate.core.Context...
		org.commontemplate.core.Templte...
	}
}
2 楼 jellyfish 2007-11-27  
1. Context definition is more like a hashmap, in my experience, this is very harmful when this appears in an interface. The reason is that at runtime, any key/value pair could be there and thus it breaks your encapsulation. With large set of data, this kind of runtime interface pencentration makes debug very hard. Take a closer look to see whether you can further isolate the uncertainty, e.g., to a variable in a method in the interface.

2. A common way to avoid the checking on the VelocityContext is to use a double-dispatcher(or visitor), make your template a visitor of the context.
1 楼 leadyu 2007-11-26  
从上面的问题看来,Template,Context,Engine之间是紧耦合的,应该被封装在一起,那么

现在一个折衷的做法就是,取消Template接口,

修改TemplateEngine 接口,去除根据Template进行绑定的方法。

只能通过模版名称进行绑定。

同时也要去除Context接口,转而采用Map。

public interface class TemplateEngine{    
   
 public void mergeTemplate(String templateName, Map context,    
   Writer pWriter) throws MergeException;       
   
}   


这样所有的实现都紧密地放在TemplateEngine里面,但是同样也是有问题的,有些情况下外层还是需要Template和Context的。

同时,对于OO分析,只从抽象概念来考虑的话Template,Context,Engine都是很自然的模型,他们的这些行为也是很自然的。可是,因为语言实现上的一些困扰,不得以,把他们揉在一起,是因为我抽象分析的有问题,还是语言本身并不完全贴近实际意义上的OO分析?

大家给点建议

相关推荐

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...

    设计模式深刻理解

    本文不仅探讨了什么是设计模式,而且还探讨了为什么要使用设计模式,以及设计原则具体的作用,还有对接口进行了分析,为什么使用接口可以松耦合,等等,是大家学习设计模式,不会知其然而不知其所以然。相信会对大家...

    设计模式(Patterns in Java)

    整个设计模式贯穿一个原理:面对接口编程,而不是面对实现.目标原则是:降低耦合,增 强灵活性. 1:前言 学习GoF 设计模式的重要性 建筑和软件中模式之异同 2:GoF 设计模式 A.创建模式 设计模式之Factory(工厂...

    二十三种设计模式【PDF版】

    整个设计模式贯穿一个原理:面对接口编程,而不是面对实现.目标原则是:降低耦合,增强灵活性. 建筑和软件中模式之异同 CSDN 的透明特别推崇《建筑的永恒之道》,认为从中探寻到软件的永恒之道,并就"设计模式"写了专门...

    《PHP高级程序设计_模式、框架与测试》中文版PDF

    它专门针对有一定经验的php程序员,详细讲解了对他们最为重要的主题:高级面向对象、设计模式、文档、测试和标准php库等内容。同时,为适应目前web开发的新趋势,作者还全面探讨了mvc架构和zend framework,以及ajax...

    PHP高级程序设计_模式、框架与测试(简体中文高清版)

    享有盛誉的PHP高级教程,Zend Framework核心开发人员力作,深入设计模式、PHP标准库和JSON 。  今天,PHP已经是无可争议的Web开发主流语言。PHP 5以后,它的面向对象特性也足以与Java和C#相抗衡。然而,讲述PHP高级...

    Java23种设计模式(Patterns in Java)

    Java 提供了丰富的API,同时又有强大的数据库系统作底层支持,那么我们的编程似乎变成了类似积木的简单"拼凑"和调用,甚至...整个设计模式贯穿一个原理:面对接口编程,而不是面对实现.目标原则是:降低耦合,增强灵活性.

    PHP高级程序设计_模式、框架与测试

    它专门针对有一定经验的php程序员,详细讲解了对他们最为重要的主题:高级面向对象、设计模式、文档、测试和标准php库等内容。同时,为适应目前web开发的新趋势,作者还全面探讨了mvc架构和zend framework,以及ajax...

    基于Davinci技术的智能家庭监控系统的设计与实现

    系统,Davinci技术的硬件产品1Ms320DM6446在一个芯片封装内集成了ARM 嵌入式处理器内核与C64x+数字信号处理器内核,提高了系统集成度、降低了系 统板级成本,双处理器的协同运作效率也有很大提高。本文在对需要实现...

    IOS开发中的设计模式汇总

    应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现。 优势:解耦合 敏捷原则:开放-封闭原则 实例:tableview的 数据源delegate,通过和protocol的配合,完成委托诉求。 列表row个数...

    asp.net知识库

    .NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎...

    基于JSP毕业设计-基于WEB的考务管理系统的设计与实现(源代码+论文).zip

    B/S模式及相关实现技术,并基于B/S模式采用JSP和QL SERVER数据库技术设计和实现一个考务管理系统。该系统实现学院自行安排考试时间、地点、监考老师,考办进行考试安排审核,这更切合学院教学需要,降低了考务管理...

    微机接口技术课件工大版

    对“计算机接口技术”的教学目标、教学体系及教学内容等提出可行性方案,例如:整合原有教学内容,增加微处理器最新进展、新型存储器及总线、基于PCI、USB总线的I/O接口设计、Windows设备驱动程序设计等;...

    安卓毕业设计加源码-MVPtest1:MVP设计模式引入安卓项目

    于是小明想起了当年在软件学院老师经常说需求是很可怕的东西,小明也想到当年将设计模式的老师,小明也想起来当年考试背诵的一段课文,依赖倒置原则,开闭原则,接口隔离原则等等一大串。小明知道有一种代码有一种...

    微服务设计与解决方案.docx

    后来为了具备一定的扩展和可靠性,就有了垂直架构,也就是加了个负载均衡,接下来是前几年比较火的SOA,主要讲了应用系统之间如何集成和互通,而到现在的微服务架构则是进一步在探讨一个应用系统该如何设计才能够更...

    论文研究-一种基于偶数格的格型矢量量化方法.pdf

    通过分析和比较数据交换平台的几种常用数据交换模式,对交换平台的系统架构、技术实现模式,设计理念和策略进行探讨分析,提出了一种基于XML的数据交换模式,阐述了XML在平台数据交换的数据表示、数据格式转换、数据...

    Java毕业设计-基于springboot开发的智慧图书管理系统设计与实现-毕业论文(附毕设源代码).rar

    论文内容既包括了系统的整体设计思路,也深入探讨了具体功能的实现细节,为读者提供了一个全面的学习和参考资料。 源代码部分则是基于Spring Boot框架进行开发的,采用了模块化、分层化的设计思想,使得代码结构...

    计算机组成原理教学网站的设计与实现

    本课题是专门为计算机组成原理课程开发的一个教学网站,针对这一特点,本文探讨了计算机组成原理教学网站的设计模式,并提出了技术上的解决方案。 本网站前台采用Dreamweaver进行页面制作,后台由Access数据库支持,...

Global site tag (gtag.js) - Google Analytics