依赖反演原理是重要的实体原理之一。依赖反转原则是在最流行的Java框架之一Spring中实现的。那到底是怎么回事?它如何帮助您设计更好的应用程序?
你会学到什么
依赖反转原理是什么?
依赖反转原理和Spring框架有什么关系?
依赖反转原理的实例
什么是依赖反演原理(DIP)?
依赖于抽象(接口),而不是实现(具体的类)
这句话是什么意思?让我们试着用一个例子来理解这一点:
让我们看一个例子,说明这意味着什么:
abstract class OutputDevice {
void copy(String device) {
Keyboard keyboard = new Keyboard();
int character;
while ((character = keyboard.read()) != -1) {
if (device.equals("Printer")) {
writeToPrinter(character);
} else {
writeToDevice(character);
}
}
}
private void writeToDevice(int character) {
// TODO Auto-generated method stub
}
private void writeToPrinter(int c) {
// TODO Auto-generated method stub
}
}
是什么copy()方法可以吗?
它从键盘上读取一个字符,然后决定该字符的去向。如果是打印机,它会写到打印机上。否则,它会将其发送到磁盘。
这里的问题是OutputDevice类型增加,逻辑copy()每次都要改变。
让我们看看另一个实现:
public interface Reader {
public char read();
}
public interface Writer {
public void write(char ch);
}
void copy(Reader r, Writer w) {
int c;
while((c = r.read()) != EOF) {
w.write(c);
}
}
我们在这里所做的是定义两个独立的接口,一个提供read(),而另一个定义write()方法。
的责任copy()方法在这里非常清楚:它从Readerinterface并将其写入到Writerinterface.
copy()现在只关注实际操作,它通过将其他一切都标识为它的依赖项来实现这一点。
的任何实现都可以使用Reader和Writer接口。
DIP与Spring框架
DIP是Spring框架启用的核心原则之一。看一下这个例子:
public class BinarySearchImpl {
public int binarySearch(int[] numbers, int numberToSearchFor) {
BubbleSortAlgorithm bubbleSortAlgorthm = new BubbleSortAlgorithm();
int[] sortedNumbers = bubbleSortAlgorithm.sort(numbers);
//...
}
}
inarySearchImpl直接创建BubbleSortAlgorithm…请注意BubbleSortAlgorithm是BinarySearchImpl,正如我们在前面的示例中所看到的,直接访问它并不是一个好主意。如果您希望稍后从冒泡排序切换到快速排序算法,则需要更改大量内部代码。BinarySearchImpl.
更好的方法BinarySearchImpl就是利用接口排序算法。下面是我们修改后的代码的样子:
public intrface SortAlgorithm {
public int[] sort(int[] numbers);
}
@Component
public class BinarySearchImpl {
@Autowired
private SortAlgorithm sortAlgorithm;
public BinarySearchImpl(SortAlgorithm sortAlgorithm) {
super();
this.sortAlgorithm = sortAlgorithm;
}
public int[] binarySearch(int[] numbers, int numberToSearchFor) {
int[] sortedNumbers = sortAlgorithm.sort(numbers);
//...
}
}
控件的用户。BinarySearchImpl类还可以传递SortAlgorithm,例如气泡排序或快速排序实现。
最后,这里有几件重要的事情要注意:
1,BinarySearchImpl是与之脱钩的SortAlgorithm利用。
2,如果使用Spring框架,则可以使用@Autowired注释BinarySearchImpl类,以自动连接可用排序算法的实现.
3,通过应用DIP,可以使代码更易于测试。测试代码可以传递依赖项模拟以正确测试代码。
依赖性反转是指识别依赖项并将其外部化。您可以使用像Spring这样的框架来简化依赖反转。DIP使您的代码更具可维护性、可重用性和可测试性。