我的Java库提供了一个实现类SomethingClient
的接口SomethingClientImpl
。界面包含您期望的应用程序将调用的方法。
但是有一个“镜像”接口SomethingHandler
,其中包含应用程序提供的方法-应用程序回调。您可以想象该应用程序为库提供了该接口的对象-也许还提供了从中获取SomethingClient
的Factory方法。
作为一个没有经验的Java设计师,我想知道是否有一个名称,以及是否/在什么程度上被推荐,以便提供一个结合了这两个概念的接口和类:
public interface SomethingClient { /*..*/ }
public interface SomethingHandler { /*..*/ }
public interface ClientAndHandler extends SomethingClient,
SomethingHandler { }
public abstract class ClientAndHandler_Impl implements ClientAndHandler {
final SomethingClient clientImpl_;
ClientAndHandler_Impl(SomethingClient clientImpl) {
this.clientImpl_ = clientImpl;
}
// TODO now all SomethingClient methods are implemented in terms of clientImpl_
// AND, SomethingHandler methods are left abstract so they are implemented by the application
}
目的是,应用程序编写者可能更喜欢从ClientAndHandler_Impl
抽象类扩展并实现回调方法,也许就客户端(传出)方法而言。这可以相对容易地完成。假设您愿意这样做,您会给 ClientAndHandler
这个概念起什么名字?
答案 0 :(得分:1)
您当前的代码看起来有点像骨架实现。您可以在massachusetts institute of technology或dzon上阅读有关它的更多信息。
其背后的想法是为客户端提供默认的实现。您可以在Java集合API中找到一些示例,例如AbstractCollection
,AbstractSet
和AbstractMap
。
接口ClientAndHandler
是冗余的。类ClientAndHandler_Impl
应该实现SomethingClient
和SomethingHandler
。
如果要明确使用骨架实现,我可以将抽象类ClientAndHandler_Impl
命名为AbstractClientInteraction
或ClientInteractionSkeleton
。
答案 1 :(得分:0)
首先,这不是设计模式。它确实包含一个直通字符:delegation pattern。
对于组合接口,我可以称其为“复合marker interface”之类的东西。我不知道有任何可接受的名称。
这是不好的,原因有两个。首先,我的类可以分别实现A和B,但是如果不实现AAndB,那么它将不匹配那些方法的类型。因此,一般类型的交集是更可取的。
第二,我认为首先需要复合类型表示不良设计。课堂应该做一件事。如果要实现两个不同的接口,那么按照定义,您就没有做一件事。