java - 接口如何打破类的依赖关系?
问题描述
我正在阅读 Clean Architecture - Bob Martin。他谈到了通过接口打破依赖关系。例如。B类使用A类。因此,B类依赖于A类(B--->A)。我们可以添加一个接口,让 B 依赖于接口,也让 A 依赖于接口(A--->I<----B)。
我不明白的是,如果类 A 具有在 B 需要的函数中使用的私有成员变量。我不必在 B 中重写与 A 相同的代码吗?另外,这不只是重复的代码吗?
这是一个例子。
class Car {
private String color;
private Integer numberOfTires;
[...]
public void printCar()
{
System.out.print("Color: " + color);
System.out.print("Number of tires: " + numberOfTires);
}
}
class Inventory{
private Car car;
private Truck truck; // left out for brevity
public void printCar()
{
car.printCar();
}
public void printTruck()
{
truck.printTruck();
}
}
我看不出接口如何帮助解决这种依赖关系。
解决方案
@Kaue Silveira 提供了一个很好的例子,但没有提到另一个重要方面。
一般来说,接口的重点不是减少类。我想您熟悉耦合和内聚这两个术语。您总是希望拥有松散耦合且高度内聚的代码。意思是,您不希望类相互依赖(耦合),而是以继承、多态等形式共享一些逻辑。这些概念是高质量面向对象设计的一些基本支柱。如果您不熟悉这些主题,绝对值得一读。
回到这个问题,如果你正在处理一个有很多特殊情况的复杂逻辑,你肯定通常会有一些重复。但是,此类问题与其他设计模式和原则更相关,这些设计模式和原则仅旨在遵守 DRY 原则并以概括解决方案的方式解决情况。
接口背后的主要思想是为有助于对象操作一致性的类设置逻辑结构。
想象一个证券交易所系统。此接口有一个名为 execute 的方法,它将执行一些应用程序逻辑。
public interface Order{
void execute();
}
可能实现此接口的其他类可能是 Buy 和 Sell。它看起来像这样:
public class Buy implement Order{
@Override
public void execute(){
//TODO: Some logic
}
}
现在 Buy 和 Sell 都有相似的代码,甚至可能有一些重复,但更重要的是,当它们实现相同的接口时,您可以以统一的方式处理它们。您可以有一些 StockManager 类,将 Buy 订单和 Sell 订单放在 some 中Quee<Order>
。由此您可以得出结论,如果使用这样的 Quee,您将能够在execute()
Order 接口的任何实现上调用方法。
在前面的论点之上,通过使用接口和 Spring 等一些框架,您可以进行自动装配。这显着减少了对较低级别实现类的依赖,使您可以在不影响顶级处理程序的情况下更改低级别类。这种类型的应用程序设计是 SOA(面向服务的架构)中的常见做法。
推荐阅读
- pandas - 如何计算缺失日期的移位和滚动总和而不将它们添加到 Pandas 的数据框中?
- javascript - React - onClick() 事件不在地图功能中显示点击项目的信息
- apache-spark - 使用 Spark 按一列的连续相同值进行分组,每组取另一列的最大值或最小值
- python - 如何判断一个数是否为二进制?
- javascript - 过滤对象数组,其中字段不完整
- python - 为什么重新索引 pandas DataFrame 会给我一个空的 DataFrame?
- javascript - Firebase:获取数据在 React Native 中不起作用
- javascript - 如何确保我的函数一次只作用于一个元素?(转发更多细节)
- javascript - JavaScript:递归函数无法正确处理 Promise
- c - pow() 有时有时在 gcc 中找不到 w/o -lm 开关