依赖倒置原则(DIP)核心思想为:应该面向接口编程而不是面向实现编程
在软件设计过程中,细节具备多变性 ,而抽象层则相对稳定。因此,以抽象层为基础搭建起来的架构要比以细节为基础搭建起来的架构要稳定的多。在这里抽象层可以是接口,也可以是抽象类,而细节则是具体的实现类
优点:
- 降低类之间的耦合性
- 提高系统的稳定性
- 提高可读性和可维护性
实现方法:面向接口编程来降低系统的耦合性,所以每个类都应该有对应的接口或者抽象类,在使用继承的时候也要应该遵循里氏替换原则。
反例:顾客去超市购物时,想要去别的超市购物怎么办?根据下面代码中来讲,就只能再去修改代码,增加逻辑
public static void main(String[] args) {
// 顾客去购物
custom custom = new custom();
custom.shopping(); // 去【每一天便利店】购物
// 问题:【每一天便利店】没有想要的东西,所以需要去另外一家超市购买怎么办?
}
static class custom{
public void shopping(){
System.out.println("去【每一天便利店】购物");
}
}
正例:新增超市的抽象基类,不同的超市实现对应的细节。
public static void main(String[] args) {
// 顾客去购物
Custom custom = new Custom();
custom.shopping(new EveryDay()); // 欢迎光临每一天便利店
custom.shopping(new Huarong()); // 欢迎华润万家超市
}
// 消费者
static class Custom{
public void shopping(Shop shop){
shop.buy();
}
}
// 超市的基类
interface Shop{
void buy();
}
// 每一天超市
static class EveryDay implements Shop{
@Override
public void buy() {
System.out.println("欢迎光临每一天便利店");
}
}
// 华润万家
static class Huarong implements Shop{
@Override
public void buy() {
System.out.println("欢迎华润万家超市");
}
}