我在这里问一个关于称为依赖注入的设计模式的问题。
DI 允许对象通过接口而不是通过其实现来了解其依赖关系。这样,实现可以在依赖对象不知道的情况下发生变化。DI的最大优点是对象之间的弱耦合。
我了解它的工作原理和用途,但它并没有完全关闭我。正如引用所说,DI具有类之间解耦的优点......但它有一个很大的缺点:通过将接口传递给我的对象而不是对象,我失去了功能,也就是说,我只会有接口的方法,但没有对象的方法。
那么,一个对象可以没有依赖关系,同时失去功能吗?我知道这不是我说的,肯定有我错的地方,它没有前面提到的缺点。但是,嘿,据我所知,我是这样看的。
首先,必须理解接口类似于合约,因为它建立了实现它的人必须提供的功能。
这提供了接口客户端与实现的内部行为“不相关” 1的优点,真正重要的是它符合接口建立的功能。虽然确实不能再访问该类的某些方法,但 DI 表明这些方法与接口实现的功能无关。
────────
1. 内部行为与界面客户端无关,但软件开发人员/设计人员则不相关。这主要发生在需要针对某些特定情况更改实现时,例如应用优化或其他设计模式。
我提出了两个场景,你可以看到 DI 的重要性以及类的方法并不完全相关。
场景一:直接访问数据源。道模式的基本示例。
正如评论中所解释的,正如您所看到的,作为
EntidadController
接口客户端的类EntidadDao
不需要知道或使用实现所述接口的类中不公开的方法。场景 2:需要使用相同接口的新实现。在这种情况下,您需要简化数据访问。
有了这个新的实现,客户端
EntidadController
现在可以选择使用EntidadDaoBaseDatosImpl
还是EntidadDaoCacheImpl
作为接口的实现EntidadDao
来使用。无论选择哪个类,客户端将使用的唯一相关方法是接口中指定的方法。实现接口的类的功能不会丢失,客户端根本不会直接使用它。现在,可能会出现这个问题:如果我真的需要访问在实现类中声明但不在接口中的某个方法怎么办?那么答案取决于:
public
在实现类中)。像这样的话题没有正确的答案,您必须评估每个案例并确定最适合您面临的情况。
当你声明一个接口的依赖时,是因为这个接口拥有你需要从那个接口执行任务所需的一切。如果实现该接口的类有其他方法,它们应该与客户端代码无关。
在一个好的设计中,接口必须提供必要的方法,以便实现接口的类的客户能够执行他们的工作。
使用依赖注入使接口的方法与实现类的公共方法一一对应是很常见的,所以这应该不是问题。
如果您想使用接口中没有的其他方法,只需将它们添加到接口中即可。
没有功能损失,它是不同的东西,接口是定义某些功能的合约,根据定义它不能限制它。
碰巧接口给代码带来了复杂性,但这种复杂性是由它的优势来证明的:将功能与实现分离。
想象一下,您设计了一个应用程序,从组件设计开始,然后定义每个组件的接口以及与其他接口的依赖关系,仅此一项,您就已经拥有了整个设计。然后你可以单独实现每个组件,通过它的单元测试,你可以模拟其他接口并在不同的控制良好的条件下(通过模拟)测试每一行组件代码,当然,你可以(或不)使用依赖注入完成所有开发后“连接”系统。
除了 Java 自己的接口之外,还有许多值得尽可能与接口分开的东西:
数据模型、基础等等。理由不是因为,也许明天,您将从 MySql 更改为 Oracle。最终的原因是,按照设计,不可能在其他模块中包含数据库访问详细信息,从而“按设计”使代码更清晰。接口示例:MyTableN、MyTablesProvider 和 POJO。
Network/Disk/Peripherals:即输入输出,不返回文件或套接字类型的对象,在这些接口中返回和接收输入/输出流或类似的。示例:InputStream、OutputStream、Reader、MiNetworkProvider、MiFileSystemProvider。
其他示例:LOGS 或应用程序注册、第三方库(通过包装器)、REST API。