<大話設計模式>本教程說明及著作權聲明
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下載連結
開放封閉原則 孫悟空任弼馬溫一職
應用情境舉例:
孫悟空從東海龍宮拿到定海神針如意金箍棒後回到花果山,和自己的部下過著自由自在的生活。那隻好景不長,因為他在地獄刪除了自己和花果山所有猴子的名單,同時又拿走了定海神針,不久便被閻王和龍王告上了天庭。玉帝正要下旨去捉拿妖猴問罪。忙被龍王勸止,龍王說孫悟空神通廣大,閻王也深表贊同。玉帝有些遲疑,問眾仙該如何是好,太白金星說不如封他一個天宮中的官職去做,這樣明為封官,實際上在暗地裡確進行壓制。玉帝深表贊同。但是要封孫悟空一個什麼官好呢?玉帝也一時想不出什麼號的職位,於是就宣仙卿百官入朝,共同商討此事。玉帝問道:“眾愛卿,現在天庭什麼地方可以空缺的職位啊?給那妖猴一個官去做。”眾人都說現在天庭的各個職位人說爆滿,無任何空缺職位。大家一時之間不知道該如何是好,此事太白金星靈機一動,向玉帝稟報道:“稟報玉帝,鑒於天庭個職位人員爆滿,不如封他一個弼馬溫的職位。”玉帝問道:“弼馬溫?是何等職位啊?”太白金星說,弼馬溫就是用來管理天馬的,反正現在天馬無人管理,在天庭新設立一個弼馬溫的職位一方面有利於管理天馬,另一方面可以不影響天庭現有的職位,最後還可以安撫妖猴。
之所以會出現上面職位難以安排的情況,這還要從天庭的官吏機制說起,是整個天庭的官吏制度導致了這種情況。在天庭中,法力越大的位置越高,相應的法力越低的位置就越低。而且法力高的由於可以得到各種相應的更多的仙桃啊、太上老君的金丹啊等就變的法力越來越大,也就導致了位置越來越高;另一方面,因為法力越來越大,所以壽命也就越來越長。這導致了什麼結果你?導致了終身制!一個職位幾乎由相應的仙人一直掌管,永遠沒有空缺的時候。在天庭是一個蘿蔔一個坑,官職一旦確定就很難更改!我們說托塔李天王,他就永遠是李天王,沒人能夠取代他的位置!那現在如何安排孫悟空呢?要做到既不影響天庭既有秩序和眾仙的利益,又能夠安撫孫悟空,那就只有新設立一個職位啦!
玉帝一聽太白金星的想法,大悅。立刻派人把孫悟空請了上來。孫悟空早就聽說天庭好玩,而且在天庭還有官職,喜出望外,歡歡喜喜的赴任去了。
定義:
開放封閉原則(Open-Closed Principle):一個軟體實體應當對擴充開放,則修改關閉。對擴充開放,意味著有新的需求或變化時,可以對現有代碼進行擴充,以適應新的情況;對修改封閉,意味著類一旦設計完成,就可以獨立完成其工作,而不要對類進行任何修改。
開放封閉原則是所有物件導向原則的核心。
“需求總是在變化”。
“世界沒有一個軟體是不變的”。
如何做到開放封閉原則呢?答案是:封裝變化,依賴介面和抽象類別,而不要依賴具體實作類別。要針對介面和抽象類別編程,不要針對具體實現編程。因為介面和抽象類別是穩定的,他們是一種對用戶端的一種承諾,是相對不變的。如果以後需要擴充或者開發新的功能,只需要實現或者繼承介面或者抽象類別即可覆蓋或者擴充新的功能,這樣做同時也不回影響新的功能。這就很好的做到了對擴充開放、對修改關閉。
實際上講,絕對封閉的系統式不存在的。無論我們怎麼保持封閉,一個系統總會有要變化的地方,“世界上沒有一個不邊的軟體”、“需求總是在改變”。我們要做的不是消滅變化,而是把變化隔離開來,並對其進行封裝。我們無法控制變化,但是我們可以預則哪裡會發生變法。把要變化的地方抽象起來,這樣以後再面臨變化的時候我們就可以盡量的擴充,而無須改變以後的代碼。
如所示:
故事分析:
太白金星獻計任孫悟空為弼馬溫一職就很好的體現了開放封閉原則。
為什麼這麼說呢?
這還要從天庭的官吏機制說起,在天庭中,法力越大的位置越高,相應的法力越低的位置就越低。而且法力高的由於可以得到各種相應的更多的仙桃啊、太上老君的金丹啊等就變的法力越來越大,也就導致了位置越來越高;另一方面,因為法力越來越大,所以壽命也就越來越長。這導致了什麼結果你?導致了終身制!一個職位幾乎由相應的仙人一直掌管,永遠沒有空缺的時候。在天庭是一個蘿蔔一個坑,官職一旦確定就很難更改!我們說托塔李天王,他就永遠是李天王,沒人能夠取代他的位置!那現在如何安排孫悟空呢?要做到既不影響天庭既有秩序和眾仙的利益,又能夠安撫孫悟空,那就只有新設立一個職位啦!
總結一下:天庭既有秩序不變,擴充一個弼馬溫的位置給孫悟空。而且這種擴張不會影響到天庭的其它秩序。這不就是對修改關閉,對擴充開放嗎?!
同時,可能不久又出現一個新的“孫悟空第二”,龍王可能又要告到天庭,“需求總是變法的”!這時候只需要按照針對孫悟空同樣的思路就可以很好解決此類變化。
再次重溫一下面的話:
“需求總是在變化。”
“世界上沒有一個軟體是不變的。”
“針對抽象編程,不要針對實現編程。”
如所示:
Java代碼實現:
建立一個職位的介面:
package com.dieremng.designPattern.OCP; /* * 職位的介面 */ public interface Position { /* * 定義職位的職責 */ public void duty(); } |
太白金星、托塔李天王、弼馬溫分別實現上面的介面。代碼依次如下:
package com.dieremng.designPattern.OCP.impl; import com.dieremng.designPattern.OCP.Position; /* * 太白金星對職位的實現 */ public class Taibaijinxin implements Position { public void duty() { System.out.println("這裡是太白金星"); } } |
package com.dieremng.designPattern.OCP.impl; import com.dieremng.designPattern.OCP.Position; /* * 托塔李天王對職位的實現 */ public class Tuotalitianwang implements Position{ public void duty() { System.out.println("這裡是托塔李天王"); } } |
package com.dieremng.designPattern.OCP.impl; import com.dieremng.designPattern.OCP.Position; /* * 弼馬溫對職位的實現 */ public class Bimawen implements Position { public void duty() { System.out.println("這裡是弼馬溫"); } } |
建立一個測試類別,代碼如下:
package com.dieremng.designPattern.OCP.client; import com.dieremng.designPattern.OCP.Position; import com.dieremng.designPattern.OCP.impl.Bimawen; import com.dieremng.designPattern.OCP.impl.Taibaijinxin; import com.dieremng.designPattern.OCP.impl.Tuotalitianwang; public class PositionTest { /** * @param args */ public static void main(String[] args) { Position taibaijinxin = new Taibaijinxin(); Position tuotalitianwang = new Tuotalitianwang(); Position bimawen = new Bimawen(); taibaijinxin.duty(); tuotalitianwang.duty(); bimawen.duty(); } } |
程式運行結果如下:
已有應用簡介:
開放封閉原則是所有物件導向原則的核心。
軟體的分析、設計、編碼、維護等生命週期的各個階段總是力求做到對修改關閉、對擴充開放。
著名的巴巴運動網生命週期的各個階段就遵循了開放封閉原則。它把基本的CRUD操作做成了一個介面,同時採用了JDK 5引入的泛型技術,這樣就可以保證以後做基本的添刪改查操作時只需要實現該類即可。但由於引入了泛型技術,同時在後台提供了對介面的抽象實現,你甚至不用寫一行代碼,就可以自如的操作資料庫。如果以後又需要擴充的地方,只需要擴充繼承擴充自己的特有的操作即可,大大提高了生產效率。
溫馨提示:
遵循開放封閉原則的關鍵是依賴於抽象,但是否依賴了抽象就一定遵循了開放封閉原則呢?這裡面更核心的東西是對職責的分離和封裝,只有分離出變化和不變的元素,把變化的地方抽象起來,這種抽象可以使用介面,也可以使用抽象類別,針對分離好的抽象編程,而不是針對具體編程,這樣才才是真正的遵循開放封閉原則。
注意:該文檔參考和使用了網路上的免費開放的圖片和內容,並以免費開放的方式發布,希望為移動互連網和智能手機時代貢獻綿薄之力!可以隨意轉載,但不得使用該文檔謀利。