Java软件设计:依赖反转原理是什么?

依赖反演原理是重要的实体原理之一。依赖反转原则是在最流行的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使您的代码更具可维护性、可重用性和可测试性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值