Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> 《Android之大話設計模式》--設計原則 第三章:開放封閉原則 孫悟空任弼馬溫一職

《Android之大話設計模式》--設計原則 第三章:開放封閉原則 孫悟空任弼馬溫一職

編輯:Android開發實例

應用場景舉例

 

       孫悟空從東海龍宮拿到定海神針如意金箍棒後回到花果山,和自己的部下過著自由自在的生活。那只好景不長,因為他在地獄刪除了自己和花果山所有猴子的名單,同時又拿走了定海神針,不久便被閻王和龍王告上了天庭。玉帝正要下旨去捉拿妖猴問罪。忙被龍王勸止,龍王說孫悟空神通廣大,閻王也深表贊同。玉帝有些遲疑,問眾仙該如何是好,太白金星說不如封他一個天宮中的官職去做,這樣明為封官,實際上在暗地裡確進行壓制。玉帝深表贊同。但是要封孫悟空一個什麼官好呢?玉帝也一時想不出什麼號的職位,於是就宣仙卿百官入朝,共同商討此事。玉帝問道:“眾愛卿,現在天庭什麼地方可以空缺的職位啊?給那妖猴一個官去做。”眾人都說現在天庭的各個職位人說爆滿,無任何空缺職位。大家一時之間不知道該如何是好,此事太白金星靈機一動,向玉帝禀報道:“禀報玉帝,鑒於天庭個職位人員爆滿,不如封他一個弼馬溫的職位。”玉帝問道:“弼馬溫?是何等職位啊?”太白金星說,弼馬溫就是用來管理天馬的,反正現在天馬無人管理,在天庭新設立一個弼馬溫的職位一方面有利於管理天馬,另一方面可以不影響天庭現有的職位,最後還可以安撫妖猴。

       之所以會出現上面職位難以安排的情況,這還要從天庭的官吏機制說起,是整個天庭的官吏制度導致了這種情況。在天庭中,法力越大的位置越高,相應的法力越低的位置就越低。而且法力高的由於可以得到各種相應的更多的仙桃啊、太上老君的金丹啊等就變的法力越來越大,也就導致了位置越來越高;另一方面,因為法力越來越大,所以壽命也就越來越長。這導致了什麼結果你?導致了終身制!一個職位幾乎由相應的仙人一直掌管,永遠沒有空缺的時候。在天庭是一個蘿卜一個坑,官職一旦確定就很難更改!我們說托塔李天王,他就永遠是李天王,沒人能夠取代他的位置!那現在如何安排孫悟空呢?要做到既不影響天庭既有秩序和眾仙的利益,又能夠安撫孫悟空,那就只有新設立一個職位啦!

       玉帝一聽太白金星的想法,大悅。立刻派人把孫悟空請了上來。孫悟空早就聽說天庭好玩,而且在天庭還有官職,喜出望外,歡歡喜喜的赴任去了。

定義: 

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

 

溫馨提示: 

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

 

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

轉自:http://www.cnblogs.com/guoshiandroid/archive/2010/06/12/1756740.html

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved