編輯: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
介紹 最近用淘寶客戶端的時候,編輯地址的時候有個地區選擇的功能。看上面的效果覺得挺酷,滾動的時候,是最後一個從下面飛上來挨著前一個。就自己鼓搗一個
在很多電商網頁及app上都有自動切換的商品的推廣快,感覺體驗挺不錯的,正好今天學習使用ViewPager,因此也實現了一個功能類似的demo。 下面是其中的兩個截
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個