qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          多態與設計模式之我的理解

          最近因為開發一個項目的關系在研究《Head First設計模式》,想從中找到一些靈感,雖然之前也看過,但是每次學習,都會有新的理解和感悟,非常感謝作者提供了這樣一本讓我受益匪淺的書!

            面向對象程序設計(注意這里是面向對象,而不是基于對象)的一個很重要的設計原則就是:針對接口編程,而不是針對實現編程!可就是這樣一句句很淺顯的話,確包含了很多面向對象的知識在里面!

            “什么是針對接口編程呢?”,“針對接口編程的真正意思是”針對超類型編程“。所以這里的”接口“就不再僅僅指的是java中的interface,還包括了抽象類,”超類型“在這里就是指”interface“和”abstract“類,當然不包括普通用于繼承的類,因為普通的類雖然可以繼承但是無法實現”多態“。而”多態“,正是”針對接口編程“的關鍵之所在!

            ”什么是多態呢?“,多態(Polymorphism)按字面的意思就是“多種狀態”,指同一個實體同時具有多種形式。在面向對象語言中,接口的多種不同的實現方式即為多態。引用Charlie Calverts對多態的描述——多態性是允許你將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之后,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。如果一個語言只支持類而不支持多態,只能說明它是基于對象的,而不是面向對象的。利用多態,程序可以針對”超類型“編程,執行時會根據實際狀況執行到真正的行為,不會被綁死在超類型的行為上。

            以下是非多態和多態的對比:

            例子:假設有一個類Animal,有兩個子類(Dog與Cat)繼承Animal:

            針對實現編程是這樣做的:

          class Animal {
          String name;
          String sex;

          public void Display()
          {
            System.out.println("name =" + name + "sex =" + sex);
          }
          public void Sound()
          {
            System.out.println("make sound!");
          }
          }

          class Dog extends Animal{
          public void Sound()
          {
            System.out.println("wang...wang...wang...");
          }
          }

          class Cat extends Animal{
          public void Sound()
          {
            System.out.println("miao...miao...miao...");
          }
          }

          public class AnimalTest {
          public static void main(String[] args)
          {
            Dog dog = new Dog();
            dog.Sound();
           
            Cat cat = new Cat();
            cat.Sound();
          }
          }




          在上面這種針對實現的做法中,dog的行為來自Animal超類的具體實現,或是重載后的Sound方法,這種依賴于”實現“的做法會被”實現“綁得死死的,沒辦法更改dog行為,除非在Dog中寫更多的代碼!

            而”針對接口/超類型編程"做法如下:

          class Animal {
          String name;
          String sex;

          public void Display()
          {
            System.out.println("name =" + name + "sex =" + sex);
          }
          public void Sound()
          {
            System.out.println("make sound!");
          }
          }

          class Dog extends Animal{
          public void Sound()
          {
            System.out.println("wang...wang...wang...");
          }
          }

          class Cat extends Animal{
          public void Sound()
          {
            System.out.println("miao...miao...miao...");
          }
          }

          public class AnimalTest {
          public static void main(String[] args)
          {
            Animal animal = new Dog();
            animal.Sound();
           
            animal = new Cat();
            animal.Sound();
          }
          }

           

            在這個例子中,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的一個類的實例。

          posted on 2013-01-19 12:52 順其自然EVO 閱讀(521) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2013年1月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 佛学| 上高县| 泾川县| 正阳县| 宁强县| 会昌县| 繁峙县| 永顺县| 沾益县| 城市| 忻州市| 海口市| 内江市| 唐山市| 石景山区| 铜鼓县| 泰宁县| 仙桃市| 天长市| 大安市| 新乐市| 哈尔滨市| 桑日县| 咸阳市| 上饶市| 修武县| 天津市| 罗江县| 佳木斯市| 左贡县| 舞钢市| 镇远县| 新巴尔虎左旗| 综艺| 滨海县| 晴隆县| 和田县| 阿克陶县| 盐城市| 海阳市| 赤壁市|