2012-11-10 54 views
3

我使用的适配器来隐藏国外API:适配器连同工厂模式

DocumentTreeNodeAdapter DocumentTreeNode 
      |      | 
      |      | 
    CommonTreeAdapter ----> CommonTreeNode ----> CommonTree (foreign) 

的CommonTreeAdapter有一个返回CommonTreeNode的适应()方法。 我只想分发接口。客户端代码将在DocumentTreeNode和DocumentTreeNodeAdapter接口上运行。

因为我想进一步简化适配器创造,应该有一个工厂:

DocumentTreeNodeAdapterFactoryImpl 

我的问题是关于工厂:

我倾向于让通用的,它将提供的方法:

register(Class<? extends DocumentTreeNodeAdapter, Class<?> target); 

检索某个适配器:

getAdapterFrom(Class<?> target); 

例如

getAdapterFrom(CommonTree.class); 

但是我应该在哪里注册Adapters?事实上,目前只有一个适配器,可以在工厂进行硬编码,但为了可扩展性,我真的很喜欢这种注册(...)方法。

稍后我将使用Guice将东西连接在一起。我应该在模块中初始化工厂吗?还是Guice为此提供了一个简单的方法?我还没有经历过Guice。

在此先感谢,我确定有人知道这是如何完成的,因为它被广泛使用,但我找不到一些样本。

亲切的问候

+0

我认为你不应该过度设计你的课程。如果只有一个适配器,那么在这一点上你根本不需要工厂。不要以为你会有另一个适配器,因为在大多数情况下它不会发生。如果您现在创建这些类,则会有未使用的功能。如果您真的需要,您可以随时增加复杂性。 –

+0

这是我对自己的想法,我认为你是对的。上面的整体思想将被解析器使用,此解析器可以将适配器分发为DocumentTreeNode,现在就完成它。我将在稍后检查课程。 – thertweck

回答

0

DocumentTreeNodeAdapter是一个接口

SimpleDocumentTreeNodeAdapter延伸DocumentTreeNodeAdapter并含有CommonTreeAdapter(适配器)

public void register(DocumentTreeNodeAdapter documentTreeNodeAdapter , Class targetClass); 
public DocumentTreeNodeAdapter getAdapterFrom(Class aClass); 

例如:

DocumentTreeNodeAdapter adapter = new SimpleDocumentTreeNodeAdapter(commonTreeAdapter); 
documentTreeNodeAdapterFactoryImpl.register(adapter , CommonTree.class); 
documentTreeNodeAdapterFactoryImpl.getAdapterFrom(CommonTree.class); 

首先响应:

只是sugestion

register(Class<? extends DocumentTreeNodeAdapter, Class<?> target); 

将成为

public void register(DocumentTreeNodeAdapter documentTreeNodeAdapter); 

,或者如果目标不是类要注册

public void register(DocumentTreeNodeAdapter documentTreeNodeAdapter , Class targetClass); 

DocumentTreeNodeAdapter将是一个适配器接口和

getAdapterFrom(Class<?> target) 

将成为

public DocumentTreeNodeAdapter getAdapterFrom(Class aClass); 

如果CommonTree实现DocumentTreeNodeAdapter下一行仍然有效

getAdapterFrom(CommonTree.class); 

但对于吉斯部分我不能帮助ü

+0

嘿,谢谢你的回复。我想保留适配器在工厂中的安装,因为它应该始终使用相同的适配器。此适配器构造所需的各种CommonTree节点。不幸CommonTree没有实现DocumentTreeNodeAdpter。这是我喜欢包装的外国API。 CommonTreeNode是具体的“对象适配器”。不过您的想法还取决于一种初始化工厂。你会把它放在哪里? – thertweck

+0

我只有春天的经验,但它是像Guice一样的IoC/Di框架。工厂的初始化将在构造函数注入的程序的开始。我只使用了setter和构造函数注入。 – Err