【原創·教程·連載】《Android之大話設計模式》–設計原則 第三章:開放封閉原則 孫悟空任弼馬溫一職

來源:互聯網
上載者:User
<大話設計模式>本教程說明及著作權聲明

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引入的泛型技術,這樣就可以保證以後做基本的添刪改查操作時只需要實現該類即可。但由於引入了泛型技術,同時在後台提供了對介面的抽象實現,你甚至不用寫一行代碼,就可以自如的操作資料庫。如果以後又需要擴充的地方,只需要擴充繼承擴充自己的特有的操作即可,大大提高了生產效率。

溫馨提示: 

遵循開放封閉原則的關鍵是依賴於抽象,但是否依賴了抽象就一定遵循了開放封閉原則呢?這裡面更核心的東西是對職責的分離和封裝,只有分離出變化和不變的元素,把變化的地方抽象起來,這種抽象可以使用介面,也可以使用抽象類別,針對分離好的抽象編程,而不是針對具體編程,這樣才才是真正的遵循開放封閉原則。

注意:該文檔參考和使用了網路上的免費開放的圖片和內容,並以免費開放的方式發布,希望為移動互連網和智能手機時代貢獻綿薄之力!可以隨意轉載,但不得使用該文檔謀利。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.