共计 1204 个字符,预计需要花费 4 分钟才能阅读完成。
简介
DIP 依赖倒置准则,高层模块不要依赖低层模块。高层模块和低层模块应该通过形象来相互依赖。除此之外,不要依赖具体实现细节,具体实现细节依赖形象。
程序要依赖于形象接口,不要依赖于具体实现。简略的说就是要求对形象进行编程,不要对实现进行编程,这样就升高了客户与实现模块间的耦合。
如何了解倒置?
在面向过程的开发时,为了使得罕用代码能够复用,个别都会把这些罕用代码写成许许多多函数的函数库,这样我在做新我的项目时,去调用这些底层的函数就能够了。比方咱们做的我的项目大多都要拜访数据库,所以咱们就把拜访数据库的代码写成函数,每次新做我的项目时就去调用这些函数。这就交搞成模块依赖低层模块。
问题也就呈现在这里,咱们要做新我的项目时,发现业务逻辑的高层模块都是一样的,但客户却心愿应用不同的数据库或存储信息形式,这时就呈现麻烦了。咱们心愿再次利用这些高层模块,单高层模块都是与低层的拜访数据库绑定在一起的,就没有方法复用高层模块。
依赖倒置的作用
- 依赖倒置准则能够升高类间的耦合性。
- 依赖倒置准则能够进步零碎的稳定性。
- 依赖倒置准则能够缩小并行开发引起的危险。
- 依赖倒置准则能够进步代码的可读性和可维护性。
依赖倒置准则的利用
上面以“顾客购物程序”为例来阐明依赖倒置准则的利用。
本程序反映了“顾客类”与“商店类”的关系。商店类中有 sell() 办法,顾客类通过该办法购物以下代码定义了顾客类通过张三网店 ZhangsanShop 购物:
class Customer {public void shopping(ZhangsanShop shop) {
// 购物
System.out.println(shop.sell());
}
}
然而,这种设计存在毛病,如果该顾客想从另外一家商店(如李四店 LisiShop)购物,就要将该顾客的代码批改如下:
class Customer{public void shopping(LisiShop shop){
// 购物
System.out.println(shop.sell());
}
}
顾客每更换一家商店,都要批改一次代码,这显著违反了开闭准则。存在以上毛病的起因是:顾客类设计时同具体的商店类绑定了,这违反了依赖倒置准则。
解决办法
定义“张三网店”和“李四网店”的独特接口 Shop,顾客类面向该接口编程,其代码批改如下:
class Customer{public void shopping(Shop shop){
// 购物
System.out.println(shop.sell());
}
}
这样,不论顾客类 Customer 拜访什么商店,或者减少新的商店,都不须要批改原有代码了.
开源我的项目举荐
SCHEDULE-BILIBILI
只有 Js 无能点啥,JS 和 Github Actions 实现哔哩哔哩每日主动签到、投币、支付处分。???? ????
awesome-IntelliJ-IDEA
这可能是全网最全的 IDEA 我的项目资源吧。???? ????