六大設計原則之裏式替換原則

  • 裏式替換原則的定義:
    裏式替換原則的定義多種定義,比較複雜,不易理解,比較容易理解的一種說法是:所有引用基類的
    地方必須能透明地使用其子類對象。其實就是“抽象”,裏式替換原則的定義就是對抽象的解釋。我
    們還是用例子來說明吧–Android 中window和view的關係。
    UML圖
    LWindow和LView的關係
  • 簡單例子代碼
**
* 窗口類,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的重要思想–抽象。抽象是優化代碼重要的一步。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章