`
leadyu
  • 浏览: 52199 次
  • 性别: 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分析?

大家给点建议

相关推荐

    接口设计模式示例

    在软件开发中,接口设计模式是一种重要的设计模式,它定义了对象之间交互的边界,使得系统各部分可以独立地进行扩展和变化。本示例主要探讨接口设计的重要性、原则以及如何在实际项目中应用。 首先,接口是面向对象...

    设计模式(包含5个设计模式)含源代码报告.rar

    其次,工厂方法(Factory Method)模式是一种创建型设计模式,它提供了一个创建对象的接口,但让子类决定实例化哪一个类。这样,工厂方法可以使一个类的实例化延迟到其子类进行,增强了代码的可扩展性和灵活性。 ...

    设计模式课程设计---使用5个以上不同的设计模式完成(java)

    在本设计模式课程设计中,我们重点探讨了五个核心的设计模式:原型模式、单例模式、抽象工厂模式、代理模式和建造者模式。这些模式在Java编程中具有广泛的应用,能够帮助开发者创建更加灵活、可扩展和易于维护的代码...

    《Java设计模式》课程设计报告.docx

    《Java设计模式》课程设计报告主要探讨了如何利用Java编程语言和MyEclipse集成开发环境来实现基于设计模式的西瓜市场系统。这个项目涵盖了四种重要的设计模式:单例模式、代理模式、建造者模式和抽象工厂模式,为...

    Java设计模式之禅

    《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书...综上所述,本书不仅是一本关于设计模式的入门书,也是对设计模式应用的深入探讨,无论是对于初级开发者、高级程序员,还是系统分析师,都能从中获得价值。

    新版设计模式手册 - C#设计模式(第二版)

    《新版设计模式手册 - C#设计模式(第二版)》是一部深入探讨C#编程中设计模式的权威指南,尤其适合已经有一定C#基础并希望提升软件设计能力的开发者阅读。设计模式是解决软件开发中常见问题的经验总结,是软件工程的...

    设计模式C++版(pdf版)

    设计模式是软件工程领域中一个极为重要的概念,它代表着一系列被广泛接受的解决特定问题的方法。GoF(Gang of Four)所提出的23种设计模式更是被视为面向对象编程的经典指南。本文旨在深入探讨这些设计模式,并结合...

    C#面向对象设计模式纵横谈 12种设计模式

    本篇将深入探讨12种核心的设计模式,它们是:单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式、适配器模式、装饰器模式、代理模式、桥接模式、组合模式、享元模式和观察者模式。 1. **单例模式**:确保一...

    GOF 23个设计模式

    《GOF 23个设计模式》是一本深入探讨软件设计的经典著作,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师合著,他们被业界尊称为“Gang of Four”(GOF)。这本书详尽阐述了23种经典的设计...

    java设计模式pdf

    - **适配器模式**(第81页):该模式用于将一个类的接口转换成客户希望的另一个接口,从而使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。书中通过数据在列表之间的移动来举例说明适配器模式的应用。 -...

    191 - 接口设计之美-通用性接口的组合应用a_android_接口设计_

    本话题“191 - 接口设计之美-通用性接口的组合应用a”着重探讨了如何通过巧妙地设计和组合通用接口来提升Android应用的灵活性和可复用性。 首先,接口设计的核心理念在于定义明确的契约,它描述了类或组件之间的...

    重学java的设计模式

    本文将着重探讨创建型模式、结构型模式和行为模式这三大类设计模式,并结合六项设计原则进行深入解析。 首先,我们来看创建型模式。创建型模式关注于对象的创建,它们提供了创建对象的灵活方式,使得代码更具复用性...

    23种设计模式(C++).pdf

    《设计模式精解-GoF 23 种设计模式解析附 C++实现源码》是一本深入探讨软件设计模式的书籍,它涵盖了创建型、结构型和行为型三种主要类型的23个经典设计模式,并提供了C++语言的实现代码。设计模式是软件工程中的...

    97-AD7609接口设计(串行模式).7z

    在串行模式下,数据通过一个时钟输入(CS)、数据输入/输出(DIN)和数据输出(DOUT)引脚进行传输。CS作为片选信号,DIN用于发送指令和数据,而DOUT则用于接收转换结果。设计中需要精确控制这些引脚的时序,以确保与ADC的...

    CBF4LIFE的《设计模式讲解JAVA》

    工厂方法模式(Factory Method Pattern)定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个;抽象工厂模式(Abstract Factory Pattern)提供一个接口用于创建相关或依赖对象的家族,而不需要明确指定具体...

    设计模式Java版

    在这个“设计模式Java版”资料中,我们将会探讨一系列基于Java的设计模式。 首先,我们要了解设计模式的三大类:创建型模式、结构型模式和行为型模式。创建型模式包括单例模式、工厂模式(简单工厂、工厂方法、抽象...

    设计模式之美—学习笔记

    在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...

    设计模式的杰作:深入设计模式

    通过以上内容可以看出,《深入设计模式》不仅涵盖了设计模式的基本概念和应用,还深入探讨了面向对象编程的基础知识以及软件设计原则,为读者提供了全面而深入的理解。无论是初学者还是有一定经验的开发者,都能从中...

Global site tag (gtag.js) - Google Analytics