【发布时间】:2019-02-07 21:25:24
【问题描述】:
我的 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 概念起什么名字?
【问题讨论】:
-
我不知道我会怎么称呼它,但我认为
ClientAndHandler是多余的;ClientAndHandler_Impl可以同时实现SomethingClient和SomethingHandler -
不确定我是否正确理解了构造,但我会通过将包含的实现对象称为“委托”模式来调用
SomethingClient的实现。 -
@daniu 这很有用,基本上,目的是将
Client部分委托给某个实现,其余部分保留抽象。 -
为什么有
SomethingHandler接口,而不仅仅是ClientAndHandler extends SomethingClient?你有只需要SomethingHandler方法的类吗? -
@DevinH。也许将它们分开作为经验法则更为正统,例如,为了更容易模拟,您希望将 Handler 分开。再说一次,我可以用
Mockito和CALLS_REAL_METHODS模拟abstract ClientAndHandler,这将保留具体(客户端)部分并只模拟抽象部分,但作者建议不要这样做。我正在研究更喜欢哪种方法,一方面分离更“SRP”,但也必须处理一个概念而不是 2 是初学者友好的。
标签: java oop design-patterns interface