什麼是依賴倒轉原則?
依賴倒轉原則是基於這樣的理念: 相對於細節的多變性, 抽象的東西要穩定的多。以抽象爲基礎搭建的架構比以細節爲基礎的架構要穩定的多。在java中, 抽象值得是接口或抽象類,細節就是具體的實現類。其核心的思想就是面向接口編程
應當遵循高層模塊不應該依賴底層模塊, 二者都應該是依賴其抽象。
抽象不應該依賴細節,細節應該依賴於抽象。
爲什麼要設計依賴倒轉原則?
(1) 制定規範
(2) 利於程序擴展和優化
(3) 代碼閱讀性更強
案例演示01 - 非依賴倒轉
有一個Person類,其中有一個用來接收信息的receive()方法
public class Normal {
public static void main(String[] args) {
Person person = new Person();
person.receive(new Email());
}
}
class Person {
public void receive(Email email) {
email.getInfo();
}
}
class Email {
public String getInfo() {
return "電子郵件消息: test";
}
}
這種方案沒有采用依賴倒轉,模式比較簡單。但是不利於後期程序的擴展。因爲目前只有一種信息來源就是郵件, 假設後期有多種信息來源,例如: 微信、短信、QQ等。那麼就要對於Person類增加相對應的代碼,從而導致代碼變得冗長,可讀性和維護性都會降低
案例演示02 - 依賴倒轉
我們可以基於多種信息來源的方式抽象一個接口出來,在接口中定義一個getInfo() 方法。具體的信息來源類都實現這個接口。在需要獲取信息的時候依賴於接口,這樣既有利於代碼的擴展性,也同時使用到了依賴倒轉原則
public class DepencyVersion {
public static void main(String[] args) {
Person person = new Person();
person.getInfo(new Wechat());
person.getInfo(new QQ());
person.getInfo(new Sms());
person.getInfo(new Email());
}
}
class Person {
public void getInfo(IReceiver receiver) {
System.out.println(receiver.getInfo());
}
}
interface IReceiver {
String getInfo();
}
class Wechat implements IReceiver {
@Override
public String getInfo() {
return "微信消息: test";
}
}
class QQ implements IReceiver {
@Override
public String getInfo() {
return "QQ消息: test";
}
}
class Sms implements IReceiver {
@Override
public String getInfo() {
return "短信消息: test";
}
}
class Email implements IReceiver {
@Override
public String getInfo() {
return "郵件消息: test";
}
}