該原則理解起來稍微有點抽象,我們可以將該原則通俗的理解為:"依賴于抽象”。
該規(guī)則告訴我們,程序中所有的依賴關(guān)系都應(yīng)該終止于抽象類或者接口,從而達(dá)到松耦合的目的。因為我們在應(yīng)用程序中編寫的大多數(shù)具體類都是不穩(wěn)定的。我們不想直接依賴于這些不穩(wěn)定的具體類。通過把它們隱藏在抽象和接口的后面,可以隔離它們的不穩(wěn)定性。
舉個例子
一個Button對象會觸發(fā)Click方法,當(dāng)被按下時,會調(diào)用Light對象的TurnOn方法,否則會調(diào)用Light對象的TurnOff方法。
這個設(shè)計存在兩個問題:
- Button類直接依賴于Light類,這種依賴關(guān)系意味著當(dāng)Light改變時,Button類會受到影響;
- Button對象只能控制Light對象,想要控制電視或者冰箱就不行了;
新的設(shè)計:
這個方案對那些需要被Button控制的對象提出了一個約束。需要被Button控制的對象必須要實現(xiàn)ISwitchableDevice接口。
所為原則,只是描述了什么是對的,但是并沒有說清楚如何去做。在軟件工程中,我們經(jīng)常使用DI(依賴注入)來達(dá)到這個目的。但是提到依賴注入,人們又會經(jīng)常提起IoC這個術(shù)語。所以先讓我們來了解下什么是IoC。
二、IoC
IoC的全名是Inverse of Control,即控制反轉(zhuǎn)。這一術(shù)語并不是用來描述面向?qū)ο蟮哪撤N原則或者模式,IoC體現(xiàn)為一種流程控制的反轉(zhuǎn),一般用來對框架進(jìn)行設(shè)計。
舉個例子
ReportService是一個用來顯示報表的流程,該流程包括Trim(),Clean(),Show()三個環(huán)節(jié)。
public class ReportService { private string _data; public ReportService(string data) {
_data = data;
} public void Trim(string data) {