Java 如何使用接口和实现处理类依赖关系
我正在使用ObjectAid和Eclipse为我最新的Java项目生成UML类图,我现在有,在两个接口之间有一个依赖关系,以及其中一个接口的一个实现。这里,Java 如何使用接口和实现处理类依赖关系,java,architecture,Java,Architecture,我正在使用ObjectAid和Eclipse为我最新的Java项目生成UML类图,我现在有,在两个接口之间有一个依赖关系,以及其中一个接口的一个实现。这里,foo是我正在使用的图形库 在上一个示例中,FooCanvas将ITexture对象绘制到屏幕上,并且FooCanvas及其接口ICanvas都将ITexture对象作为其方法的参数 画布类中导致此依赖关系的方法如下所示: void drawTexture(ITexture texture, float x, float y); 此外,我还
foo
是我正在使用的图形库
在上一个示例中,FooCanvas
将ITexture
对象绘制到屏幕上,并且FooCanvas
及其接口ICanvas
都将ITexture
对象作为其方法的参数
画布类中导致此依赖关系的方法如下所示:
void drawTexture(ITexture texture, float x, float y);
此外,我还尝试使用Java的泛型对方法签名进行修改:
<T extends ITexture> void drawTexture(T texture, float x, float y);
void drawTexture(T纹理、浮动x、浮动y);
其结果是一个类图,其中只有接口和实现类之间的依赖关系,而画布对象对纹理没有依赖关系。我不确定这是否更理想
接口和实现对另一个接口的依赖性是一种预期模式,还是将实现与其接口依赖性“隔离”是典型的和/或可能的?或者通用方法是理想的解决方案吗?您的问题在于您试图解决错误的问题。面向对象设计的一个要点是健壮性和灵活性,即在不更改/破坏其他代码的情况下,可以更改某些实现的程度 你想问的是某种模式是否理想?但问题是:“理想”是什么?我将引用Scot Meyers的文章,这篇文章是关于C++的,但是他试图进行的概念不适用于语言。 封装是一种手段,而不是目的。封装本身并没有什么可取之处。封装之所以有用,只是因为它在我们的软件中产生了我们关心的其他东西。特别是,它具有灵活性和健壮性 你应该问的问题是: 有多少代码可能被破坏是为了计算可能被破坏的函数 影响也就是说,如果更改一个实现会导致更多 与更改另一个功能相比,可能会导致功能中断 实施 关于你的例子,别人告诉你什么是理想并不特别容易。您是否应该公开
ITexture
接口?您是否应该引入一个名为IDrawable
的新接口来扩展纹理?目前的方法还可以。但实际上我不知道,因为我不知道实现!如果更改纹理实现,可能一切都会中断**这是一个只有你才能回答的问题,同时考虑到我上面提到的几点:
- 如果您更改了ITexture实现,有多少代码需要更改或将中断
- 当前的实现是否足够健壮
- 使用当前的实现,您可以扩展系统多少