編輯:Android開發實例
應用場景舉例:
《白蛇傳》是中國四大民間傳說之一,婦孺皆知。
在大多數人的感覺和印象中,白蛇是一個善良癡情、知恩圖報、溫柔友善、美貌絕倫、冰雪聰明、明辨是非、救苦救難的活菩薩;而法海卻是一個仗著自己的法力高強、打著降妖除魔的口號而惡意拆散許仙和白娘子這對恩愛夫妻負面形象。大多說人之所以覺得如此,主要是因為影視中的白蛇善良的無以復加。試想,如果傳說和影視中的白蛇不是表現的善良,恐怕人們恨不得早些讓法海去把白蛇收服呢。
但是,法海真的那麼壞嗎?法海真的一無是處嗎?
法海不壞。法海是一個非常敬業的人!
法海多年來苦心鑽研佛法、潛心修煉是為了降妖除魔、解救世人。法海的原則是凡是妖魔都要被降服。盡管你可能說,妖魔也有善良的啊。首先這個善良本身就已經加入了你主觀意志。是你想象中的善良,是你強加的。另外,人和妖的世界時不同的世界,不同的世界做事和行為方式肯定是有極大的碰撞,對一個世界好的事情,對另外一個世界可能就是徹頭徹尾的壞了。一句話:兩個世界語言溝通有障礙。就按照你說的白蛇善良,你就在你的妖界善良就行了,干嘛非要跑到人間來。為了報恩?報恩非要嫁給許仙才算是報恩嗎?報恩的方式有無數種,如果每一個收到許仙恩惠的女子都要嫁給許仙,你白蛇怎麼辦?人和妖界既然是兩個不同的世界,就肯定有很大的不同,就肯定會有很大的摩擦。法海在發誓要收服白蛇前肯定也想過白蛇的善良,但更多的是:你在妖界善良也就罷了,為何來到人間?怎麼保證你不危害世人?所以凡事出來的妖魔,法海就必然收服了。
其實法海說到底也只是非常敬業而已。邏輯步驟很簡單:法海的任務是是降妖除魔、造福於眾生;白蛇是妖;所以要除掉。如此敬業的人,怎能不贏的我們的掌聲呢?
定義:
裡氏代換原則(Liskov Substitution Principle)是指:一個軟件實體如果使用的是基類的話,那麼也一定適用於其子類,而且它根本覺察不錯使用的是基類對象還是子類對象;反過來的代換這是不成立的,即:如果一個軟件實體使用一個類的子類對象,那麼它不能夠適用於基類對象。
裡氏代換原則是由麻省理工學院(MIT)計算機科學實驗室的Liskov女士,在1987年的OOPSLA大會上發表的一篇文章《Data Abstraction and Hierarchy》裡面提出來的,主要闡述了有關繼承的一些原則,也就是什麼時候應該使用繼承,什麼時候不應該使用繼承,以及其中的蘊涵的原理。 2002年,軟件工程大師Robert C. Martin,出版了一本《Agile Software DevelopmentPrinciples Patterns and Practices》,在文中他把裡氏代換原則最終簡化為一句話:“Subtypes must besubstitutable for their base types”。也就是,子類必須能夠替換成它們的基類。
裡氏代換原則講的是基類和子類的關系,只有這種關系存在的時候裡氏代換原則才能夠成立。
裡氏代換原則是實現開放封閉原則的具體規范。這是因為:實現開放封閉原則的關鍵是進行抽象,而繼承關系又是抽象的一種具體實現,這樣LSP就可以確保基類和子類關系的正確性,進而為實現開放封閉原則服務。
如下圖所示:
故事分析:
法海的任務是降妖除魔、造福眾生。凡是妖魔現身,法海必定全力誅滅之。
而白蛇是修煉千年的蛇妖,蛇妖也是妖。
法海要做的就是不管你是什麼要麼,只要是要麼我就要把你收服,以防再次出來危害人間。他並不用區分你是蛇妖還是狐妖,更不用管你蛇妖中的青蛇還是白色。
凡是對妖魔這個基類適用的 白蛇、青蛇就全部適用。
Java代碼實現:
妖魔的基類:
package com.diermeng.DesignPattern.LSP;
/*
* 妖魔的基類
*/
public abstract class Spirit {
/*
* 妖魔的行為方法
*/
public abstract void say();
}
蛇妖的基類
package com.diermeng.DesignPattern.LSP;
/*
* 蛇妖的基類,繼承妖魔,可以擴展方法屬性
*/
public abstract class Snake extends Spirit {
@Override
public abstract void say();
}
白蛇類:
package com.diermeng.DesignPattern.LSP;
/*
* 白蛇對蛇妖的繼承實現
*/
public class WhiteSnake extends Snake {
@Override
public void say() {
System.out.println("我是白蛇");
}
}
建立一個測試類,代碼如下:
package com.diermeng.DesignPattern.LSP.client;
import com.diermeng.DesignPattern.LSP.Spirit;
import com.diermeng.DesignPattern.LSP.WhiteSnake;
public class LSPTest {
/**
* @param args
*/
public static void main(String[] args) {
Spirit spirit = new WhiteSnake();
spirit.say();
}
}
程序運行結果如下:
我是白蛇
已有應用簡介:
這裡主要分析一下Java編譯器對裡氏代換原則的支持機制。
在Java中如果子類覆蓋了基類的方法,子類是該方法的訪問權限必須是不能低於它在父類中的訪問權限的。這樣在才能保證在客戶端程序調用父類相應方法而需要使用子類的相應的方法代替時(調用父類的方法時需要使用子類相應的方法是普遍的),不會因為子類的方法降低了訪問權限而導致客戶端不能在繼續調用。
溫馨提示:
裡氏代換原則是很多其它設計模式的基礎。
它和開放封閉原則的聯系尤其緊密。違背了裡氏代換原則就一定不符合開放封閉原則。
注意:該文檔參考和使用了網絡上的免費開放的圖片和內容,並以免費開放的方式發布,希望為移動互聯網和智能手機時代貢獻綿薄之力!可以隨意轉載,但不得使用該文檔謀利。
目前Android已經在只能手機市場已經具有強大的霸主地位,也吸引了越來越多的追捧者。Android的學習也越來越火。但是,報名費用確實大多人望而卻步 一、新建項
在上篇文章給大家介紹深入淺析Android Fragment(上篇),包括一些基本的用法和各種API,如果還想深入學習請繼續關注本篇文章。 本篇將介紹上篇提到的:
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我
本文實例講述了Android編程學習之異步加載圖片的方法。分享給大家供大家參考,具體如下: 最近在android開發中碰到比較棘手的問題,就是加載圖片內存溢出。我