<大話設計模式>本教程說明及著作權聲明
l 該文檔參考和使用了網路上的免費開放的圖片和內容,並以免費開放的方式發布,希望為移動互連網和智能手機時代貢獻綿薄之力!可以隨意轉載,但不得使用該文檔謀利。
l 如果對該文檔有任何疑問或者建議,請進入官方部落格
http://www.cnblogs.com/guoshiandroid/留言或者直接與國士工作室聯絡(後附連絡方式),我們會謹慎參考您的建議並根據需要對本文檔進行修改,以造福更多開發人員!
l 《大話設計模式》的最新及完整內容會在國士工作室官方部落格定期更新,請訪問國士工作室部落格
http://www.cnblogs.com/guoshiandroid/擷取更多更新內容。
國士工作室是一支專註於Android平台企業級應用開發的技術團隊,致力於做中國最棒的Android應用程式開發機構,提供最棒的Android企業級應用開發培訓服務。
企業培訓和開發合作官方連絡方式:
電話:18610086859
Email:hiheartfirst@gmail.com
QQ:1740415547
QQ群:148325348
國士工作室 有你更美好!
查看其他部分:本教程整體說明及章節索引
本文PDF下載連結
針對介面編程-問世間情為何物 直教人生死相許
應用情境舉例:
“十六年後 在此重會;夫妻情深 勿失信約”,悲痛欲絕的楊過跑到斷腸崖,看到小龍女親手留在石壁上的文字,即驚喜又痛苦不欲生:“十六年!為什麼要等到十六年?!”。
但是信約已定,癡情的楊過也只能等十六年了。
離開斷腸崖後,楊過一邊開始了自己的苦苦的等待與思戀,一邊寄情練功,當然開始時
候也忘不了吃那療傷的草藥。後來楊過巧遇了千年神鵰,和神鵰一見如故,從此便開始修鍊獨孤求敗的武功。無事可做,寄情練劍倒也不失為人生的一大快事。“相思無用,唯別而已。別期若有定,千般煎熬又何如?莫道黯然銷魂,何處柳暗花明?!”,驚天地泣鬼神的黯然銷魂掌就這樣誕生了。時
光飛逝,恍惚間快過了十六年。此時,楊過的神功已成,想象著十六年約期就將來臨,心中想象著自己一生的摯愛,不免感慨和激動萬分!在祭拜過求敗他老人家之後,楊過和神鵰一起開始去赴那場長達十六年之久的約會。令眾生激動和豔羨。
再出江湖的楊過懲奸除惡、幫扶弱小,很快就俠名遠播,被人尊稱為“神鵰俠”。自己心中想象著小龍女過往的一笑一顰,想象著她是怎麼度過這十六年的,不禁催生了更加濃烈的相思和相見之情。
千呼萬喚,終於,這一天來到!
斷腸崖邊,佳人芳蹤跡未現,過兒萬念俱灰,縱身跳下懸崖…
幸好懸崖下面是深淵,楊過並沒有死,被水衝到了岸邊的楊過蘇醒過來後,看到了很多小蜜蜂,他一眼就認出了這是小龍女樣的蜜蜂,莫非龍兒就在附近?最後在深潭水下,楊過找到了自己苦苦等待了十六年的摯愛。原來小龍女得知自己無藥可救,也縱身跳下斷腸崖,十六年之期只不過是為了讓楊過不要輕生。但是跳崖後的小龍女並沒有死掉,接著就在穀底一個世外桃源的地方慢慢的療傷,竟然完全康複了。真是有情人終成眷屬,有情人終成名人。
定義:
介面是一系列方法的聲明,是一些方法特徵的集合,一個介面只有方法的特徵沒有方法的實現,因此
這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。
介面是對抽象的抽象。
介面就是標準,就是承諾。
針對介面編程,不要針對具體編程是依賴倒轉原則的另外一種表述。
針對介面編程又稱為面向介面編程,針對介面編程就是要先設計一系列的介面,把設計和實現分離開,使用時只需引用介面即可,也由於系統各部分的解耦合。如所示:
故事分析:
“十六年後 在此重會;夫妻情深 勿失信約”就是針對介面編程的一個絕妙的例子。而且最後還加了“信約”一次。言外之意就是說我們說好了要十六年在此地重逢,我們倆都要遵照此約定。根據上面的故事,小龍女和楊過制定好介面後,就縱身跳下了懸崖,不管自己的過兒了,因為她此時已經不用關心過兒怎麼去再十六年後河自己相見,只要十六年後在此地相見即可,也就是說小龍女針對和使用都是介面,至於楊過怎麼實現,她此時已經身患絕症而無法顧及了。而楊過看過此約定後,雖然無奈,但也只好照辦。具體實現如下:回去吃斷腸草調理自己,然後以神鵰為伴練習武功,知道練成了黯然銷魂掌而神功大成,然後就是在江湖上做俠義之事,然後就是按照信約與十六年後來
到斷腸崖邊;而小龍女就在穀底慢慢的調養,十六年後身體早已康複,而且越發迷人了。當楊過沒有見到小龍女時縱身跳崖,遵照了“問世間情為何物,直教人生死相許”標準。
總結一下:小龍女和楊過定下介面,然後各自針對介面各自獨立的做事,最終得以相見。
針對介面編程是未來提高程式的可維護性、延展性和可複用性。如果你在一個類中直接使用另外的一個,這樣就把兩個類緊密的聯絡在了一起,以後如果想做出改變就很難了。如果針對介面編程,當業務變化時我們只需要用一個新的類實現介面即可,而用戶端依舊可以使用介面引用新的類的,同時也保證了用戶端的不變性。這樣用戶端和實現端互不影響,保持了各自的相對獨立性。正如小龍女和楊過的,他們樹立了十六年制約後,就不用關心彼此的如何去赴這場約定,只需要按照約定做事就OK了。互不影響,自由在在。如所示:
Java代碼實現:
建立一個“信約”的介面,這個介面是楊過和小龍女都必須通過自己的方式實現的。代碼如下:
package com.diermeng.designPattern.dating; /* * 楊過和小龍女定下的約定介面 */ public interface Dating { /* * 約定的介面 */ public void dating(); } |
然後分別建立楊過和小龍女的實作類別,分別實現上面的介面。代碼依次如下:
package com.diermeng.designPattern.dating.impl; import com.diermeng.designPattern.dating.Dating; /* * 楊過對介面的實現 */ public class Yangguo implements Dating { /* * 姓名 */ String name; /* * 預設空構造方法 */ public Yangguo(){} /* * 傳入name參數的構造方法 */ public Yangguo(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } /* * (non-Javadoc) * @see com.diermeng.dating.inter.Dating#dating() * 楊過對約定的實現 */ public void dating() { if(this.getName()!=null){ System.out.println(this.getName()+" : "+"十六年後 在此重會;夫妻情深 勿失信約"); } else{ System.out.println("十六年後 在此重會;夫妻情深 勿失信約"); } } } |
package com.diermeng.designPattern.dating.impl; import com.diermeng.designPattern.dating.Dating; /* * 小龍女對介面的實現 */ public class XiaoLongnv implements Dating{ /* * 姓名 */ String name; /* * 預設空構造方法 */ public XiaoLongnv(){} /* * 傳入name參數的構造方法 */ public XiaoLongnv(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } /* * (non-Javadoc) * @see com.diermeng.dating.inter.Dating#dating() * 小龍女對約定的實現 */ public void dating() { if(this.getName()!=null){ System.out.println(this.getName()+" : "+"十六年後 在此重會;夫妻情深 勿失信約"); } else{ System.out.println("十六年後 在此重會;夫妻情深 勿失信約"); } } } |
建立一個測試類別,代碼如下:
package com.diermeng.designPattern.dating.client; import com.diermeng.designPattern.dating.Dating; import com.diermeng.designPattern.dating.impl.XiaoLongnv; import com.diermeng.designPattern.dating.impl.Yangguo; /* * 對楊過和小龍女約定進行測試的用戶端 */ public class DatingTest { public static void main(String[] args) { //分別執行個體化執行個體化 Dating yangguo = new Yangguo("過兒"); Dating xiaoLongnv = new XiaoLongnv("龍兒"); //調用各自的方法 yangguo.dating(); xiaoLongnv.dating(); } } |
程式運行結果如下:
過兒 : 十六年後 在此重會;夫妻情深 勿失信約 龍兒 : 十六年後 在此重會;夫妻情深 勿失信約 |
已有應用簡介:
Java是相面對象編程的語言,而物件導向編程的核心之一就是要針對針對介面編程、不要針對實現編程,在Java API中的標誌介面java.io.Serializable和java.rmi.Remote等就是我們經常遇到的,下面以java.io.Serializable為例說明一下,原始碼如下:
package java.io; public interface Serializable{} |
UML圖形如所示:
當然在J2EE架構的使用中到處都是針對介面編程的身影。例如在www.babasport.com中幾乎每一處都是針對介面編程的,令人印象非常深刻的一點就是巴巴運動網把對資料庫的CRUD等基本操作封裝在了一個統一介面中,這給以後的代碼的編寫和資料庫的操作帶來了極大的方便,當然這裡也使用了Java 5的泛形技術。有興趣的讀者可以去學習巴巴運動網的原始碼。
溫馨提示:
許下的承諾就是欠下的債。所以不要輕易做出承諾。
楊過和小龍女為了承諾而付出了十六年的努力。
在軟體設計和編碼中,如果確立了介面,也就對客戶做出了承諾,這種承諾幾乎沒有改變的機會,時間越長越是如此,因為那是別人對你介面的使用已經遍布世界各地,當然前提是你的借口很出色,這樣才能取得很多人的信賴和消費。
不要輕易說:“我愛你“,因為這是一生的承諾。
注意:該文檔參考和使用了網路上的免費開放的圖片和內容,並以免費開放的方式發布,希望為移動互連網和智能手機時代貢獻綿薄之力!可以隨意轉載,但不得使用該文檔謀利。