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