- 裏式替換原則的定義:
裏式替換原則的定義多種定義,比較複雜,不易理解,比較容易理解的一種說法是:所有引用基類的
地方必須能透明地使用其子類對象。其實就是“抽象”,裏式替換原則的定義就是對抽象的解釋。我
們還是用例子來說明吧–Android 中window和view的關係。
UML圖
- 簡單例子代碼
**
* 窗口類,show時依賴於LView的子類
*/
public class LWindow {
public void show(LView child) {
child.draw();
}
}
//建立視圖抽象,測量視圖的寬高爲公用代碼,具體繪製的實現交給具體的子類
public abstract class LView {
public abstract void draw();
//測量視圖的寬高
public void measure(int width, int height) {
//測量視圖的大小
}
}
//我們繪製一個文本的LView
public class LTextView extends LView{
@Override
public void draw() {
Log.e("View","請在這裏繪製文本!");
}
}
//我們繪製一個圖片的LView
public class LImageView extends LView{
@Override
public void draw() {
Log.e("View","Hello,請在這裏繪製圖片!");
}
}
引用:
LWindow mWindow = new LWindow();
//show一個LTextView
LTextView mTextView = new LTextView();
mWindow.show(mTextView);
//show一個LImageView
LImageView mImageview = new LImageView();
mWindow.show(mImageview);
在上述例子中,LWindow依賴於LView,而LView定義了一個視圖抽象,measure類是各個子類共享
的方法,子類通過覆寫LView的draw方法實現具有各自特色的功能,在這個方法中繪製自己想要的
內容。任何繼承自LView的子類都可以傳遞給show函數,相當於替換掉LView,這就是裏式替換原則。
通過裏式替換,就可以自定義各式各樣的view,然後傳遞給LWindow,LWindow負責show到屏幕
上。
- 回顧上篇文章
回顧分析下第二篇文章的例子中用到的裏式替換(六大設計原則之開閉原則),其也很好的反應了
裏式替換這個原則,即MemoryCache、DiskCache、DoubleCache都可以替換ImageCache的工
作,並保證了其行爲的正確性。ImageCache建立了獲取緩存圖片、保存圖片的接口規範,
MemoryCache等根據該接口規範實現了相應的功能,用戶在使用的使用,只需要指定具體的緩存
對象就可以動態的替換ImageLoad中的緩存策略。這就使得在不改變原有代碼的同時,可以使用
/更改一種緩存策略,這就是擴展性。
假若Imagelaod 中的setImageCache(ImageCache cache)中的cache對象不能夠被子類替換,這
意味着用戶不能夠在不改變原有代碼的前提下實現不同的緩存策略。裏式替換原則爲這類問題提供
了指導性原則,即建立抽象,通過抽象建立規範,具體的實現在運行時替換掉抽象,保證系統的擴
展性、靈活性。
開閉原則和裏式替換原則是生生相依的關係,通過裏式替換來達到開閉的效果。這兩者都同時強調
了一個OOP的重要思想–抽象。抽象是優化代碼重要的一步。