gpt4 book ai didi

java - 适配器与工厂模式

转载 作者:搜寻专家 更新时间:2023-11-01 03:54:22 26 4
gpt4 key购买 nike

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

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

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

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

DocumentTreeNodeAdapterFactoryImpl

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

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

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

检索某个适配器:

getAdapterFrom(Class<?> target);

例如

getAdapterFrom(CommonTree.class);

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

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

提前致谢,我确信有人知道这是如何完成的,因为它被广泛使用,但我找不到它的一些示例。

亲切的问候

最佳答案

DocumentTreeNodeAdapter 是一个接口(interface)

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

第一 react :

只是一个建议

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

会变成

public void register(DocumentTreeNodeAdapter documentTreeNodeAdapter);

或者如果目标不是您要注册的适配器类

public void register(DocumentTreeNodeAdapter documentTreeNodeAdapter , Class targetClass);

DocumentTreeNodeAdapter 将是一个接口(interface),

getAdapterFrom(Class<?> target)

会变成

public DocumentTreeNodeAdapter getAdapterFrom(Class aClass);

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

getAdapterFrom(CommonTree.class);

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

关于java - 适配器与工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13322284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com