法則2:針對接口編程,而非(接口的)實(shí)現(xiàn)
[ Program To An Interface, Not An Implementation ]
接口
n???????? 接口是一個(gè)對象在對其它的對象進(jìn)行調(diào)用時(shí)所知道的方法集合。
n???????? 一個(gè)對象可以有多個(gè)接口(實(shí)際上,接口是對象所有方法的一個(gè)子集)
n???????? 類型是對象的一個(gè)特定的接口。
n???????? 不同的對象可以具有相同的類型,而且一個(gè)對象可以具有多個(gè)不同的類型。
n???????? 一個(gè)對象僅能通過其接口才會(huì)被其它對象所了解。
n???????? 某種意義上,接口是以一種非常局限的方式,將“是一種…”表達(dá)為“一種支持該接口的…”。
n???????? 接口是實(shí)現(xiàn)插件化(pluggability)的關(guān)鍵
實(shí)現(xiàn)繼承和接口繼承
n???????? 實(shí)現(xiàn)繼承(類繼承):一個(gè)對象的實(shí)現(xiàn)是根據(jù)另一個(gè)對象的實(shí)現(xiàn)來定義的。
n???????? 接口繼承(子類型化):描述了一個(gè)對象可在什么時(shí)候被用來替代另一個(gè)對象。
n???????? C++的繼承機(jī)制既指類繼承,又指接口繼承。
n???????? C++通過繼承純虛類來實(shí)現(xiàn)接口繼承。
n???????? Java對接口繼承具有單獨(dú)的語言構(gòu)造方式-Java接口。
n???????? Java接口構(gòu)造方式更加易于表達(dá)和實(shí)現(xiàn)那些專注于對象接口的設(shè)計(jì)。
接口的好處
n???????? 優(yōu)點(diǎn):
F??????? Client不必知道其使用對象的具體所屬類。
F??????? 一個(gè)對象可以很容易地被(實(shí)現(xiàn)了相同接口的)的另一個(gè)對象所替換。
F??????? 對象間的連接不必硬綁定(hardwire)到一個(gè)具體類的對象上,因此增加了靈活性。
F??????? 松散藕合(loosens coupling)。
F??????? 增加了重用的可能性。
F??????? 提高了(對象)組合的機(jī)率,因?yàn)楸话瑢ο罂梢允侨魏螌?shí)現(xiàn)了一個(gè)指定接口的類。
n???????? 缺點(diǎn):
F??????? 設(shè)計(jì)的復(fù)雜性略有增加
(譯者注:接口表示“…像…”(LikeA)的關(guān)系,繼承表示“…是…”(IsA)的關(guān)系,組合表示“…有…”(HasA)的關(guān)系。)
接口實(shí)例
該方法是指其它的一些類可以進(jìn)行交通工具的駕駛,而不必關(guān)心其實(shí)際上是(汽車,輪船,潛艇或是其它任何實(shí)現(xiàn)了IManeuverabre的對象)。