适配器和工厂模式

时间:2012-11-10 13:03:15

标签: java design-patterns adapter factory

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

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

CommonTreeAdapter有一个apply()方法,它返回一个CommonTreeNode。 我只想分发接口。客户端代码将在DocumentTreeNode和 DocumentTreeNodeAdapter接口。

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

DocumentTreeNodeAdapterFactoryImpl

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

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

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

检索某个适配器:

getAdapterFrom(Class<?> target);

e.g。

getAdapterFrom(CommonTree.class);

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

我稍后会用Guice把东西连在一起。我应该初始化模块中的工厂还是Guice提供了一种简单的方法来执行此操作?我还没有见过Guice。

在此先感谢,我确信有人知道这是如何做的,因为它是广泛使用的东西,但我找不到一些样品。

亲切的问候

1 个答案:

答案 0 :(得分: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部分,我无法帮助你