4

我正在使用适配器来隐藏外部 API:

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

CommonTreeAdapter 有一个返回 CommonTreeNode 的 adapt() 方法。我只想分发接口。客户端代码将对 DocumentTreeNode 和 DocumentTreeNodeAdapter 接口进行操作。

因为我想进一步简化Adapter的创建,所以应该有一个Factory:

DocumentTreeNodeAdapterFactoryImpl

我的问题是关于那个工厂:

我倾向于使它通用,它会提供方法:

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

检索某个适配器:

getAdapterFrom(Class<?> target);

例如

getAdapterFrom(CommonTree.class);

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

稍后我将使用 Guice 将东西连接在一起。我应该在模块中初始化工厂还是 Guice 提供了一种简单的方法来做到这一点?我还没有使用 Guice 的经验。

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

亲切的问候

4

1 回答 1

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);

第一反应:

只是一个建议

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);

但对于 Guice 部分,我帮不了你

于 2012-11-10T14:44:25.460 回答