多態與設計模式之我的理解
最近因為開發一個項目的關系在研究《Head First設計模式》,想從中找到一些靈感,雖然之前也看過,但是每次學習,都會有新的理解和感悟,非常感謝作者提供了這樣一本讓我受益匪淺的書!面向對象程序設計(注意這里是面向對象,而不是基于對象)的一個很重要的設計原則就是:針對接口編程,而不是針對實現編程!可就是這樣一句句很淺顯的話,確包含了很多面向對象的知識在里面!
“什么是針對接口編程呢?”,“針對接口編程的真正意思是”針對超類型編程“。所以這里的”接口“就不再僅僅指的是java中的interface,還包括了抽象類,”超類型“在這里就是指”interface“和”abstract“類,當然不包括普通用于繼承的類,因為普通的類雖然可以繼承但是無法實現”多態“。而”多態“,正是”針對接口編程“的關鍵之所在!
”什么是多態呢?“,多態(Polymorphism)按字面的意思就是“多種狀態”,指同一個實體同時具有多種形式。在面向對象語言中,接口的多種不同的實現方式即為多態。引用Charlie Calverts對多態的描述——多態性是允許你將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之后,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。如果一個語言只支持類而不支持多態,只能說明它是基于對象的,而不是面向對象的。利用多態,程序可以針對”超類型“編程,執行時會根據實際狀況執行到真正的行為,不會被綁死在超類型的行為上。
以下是非多態和多態的對比:
例子:假設有一個類Animal,有兩個子類(Dog與Cat)繼承Animal:
針對實現編程是這樣做的:
class Animal { class Dog extends Animal{ class Cat extends Animal{ public class AnimalTest { 而”針對接口/超類型編程"做法如下:
在這個例子中,Animal animal = new Dog();表示我定義了一個Animal類型的引用,指向新建的Dog類型的對象。由于Dog是繼承自它的父類Animal,所以Animal類型的引用是可以指向Dog類型的對象的。 在這種方式中,程序在執行時會根據animal的實際狀況(對應哪個子類的賦值)執行到真正的行為(哪個子類的方法),不會被綁死在超類型的行為上,這也就是“在運行時指定具體實現的對象”,這也是多態的宗旨!當然“多態”的真正含義并不僅僅限于此,而“針對接口編程”正是利用了面向對象的這種“多態”特征來達到其“接口和具體實現分離“這一目的的! 多態總結: (1)多態是通過: 1、接口 和 實現接口并覆蓋接口中同一方法的幾不同的類體現的 2、父類 和 繼承父類并覆蓋父類中同一方法的幾個不同子類實現的. (2)通過將子類對象引用賦值給超類對象引用變量來實現動態方法調用。 (3)java 的這種機制遵循一個原則:當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。 1、如果a是類A的一個引用,那么,a可以指向類A的一個實例,或者說指向類A的一個子類。 2、如果a是接口A的一個引用,那么,a必須指向實現了接口A的一個類的實例。 |