美文网首页
里氏替换原则

里氏替换原则

作者: wuchao226 | 来源:发表于2019-04-28 17:53 被阅读0次

    里氏替换原则定义:所有引用基类的地方必须能透明的使用其子类的对象。

    面向对象的语言的三大特点是继承、封装、多态,里氏替换原则就是依赖于继承、多态这两大特性。里氏替换原则简单来说就是,所有引用基类的地方必须能透明的使用其子类的对象。通俗讲,只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者根本就不需要知道是父类还是子类。但是反过来就不行了,有子类出现的地方,父类未必就能适应。总结就是两个字:抽象。

    具体代码实现:

    //窗口类
    public class Window {
        public void show(View child){
            child.draw();
        }
    }
    
    //建立视图抽象,测量视图的宽高为公用代码,绘制实现交给具体的子类
    public abstract class View {
        public abstract void draw();
        public void measure(int width, int height){
            //测量视图大小
        }
    }
    
    //文本控件类的具体实现
    public class TextView extend View {
         public void draw(){
              //绘制文本
         }
    }
    
    //ImageView的具体实现
    public class ImageView extend View {
         public void draw(){
              //绘制图片
         }
    }
    

    上述例子中,Window 依赖于 View,而 View 定义了一个视图对象,measure 是各个子类共享的方法,子类通过复写 View 的 draw 方法实现具有各自特色的功能,子这里,这个功能就是绘制自身的内容。任何继承自 View 类的子类都可以传递给 show 函数,就是所说的里氏替换。通过里氏替换,就可以自定义各式样式、千变万化的 View,然后传递给 Window,Window 负责组织 View,并且将 View 显示到屏幕上。

    里氏替换原则的核心原理是抽象,抽象又依赖于继承这个特性,在 OOP 中,继承的优缺点都相当明显。优点有以下几点:
    (1)代码重用,减少创建类的成本,每个子类都有父类的方法和属性
    (2)子类与父类基本相似,但又与父类有所区别
    (3)提高代码的可扩展性
    继承的缺点:
    (1)继承是侵入性的,只要继承就必须拥有父类的所有属性和方法
    (2)可能造成子类代码冗余、灵活性降低,因为子类必须拥有父类的属性和方法

    开放 — 封闭原则 中,MemoryCache、DiskCache、DoubleCache 都可以替换 ImageCache 的工作,并且能够保证行为的正确性,就很好的反应了里氏替换原则。ImageCache 建立了获取图片缓存、保存图片的接口规范,MemoryCache 等根据接口规范实现了相应的功能,用户只需要在使用时指定具体的缓存对象就可以动态替换 ImageLoader 中的缓存策略。这就使得 ImageLoader 的缓存体系具有了无限的可能性,也就是保证了可扩展性。

    开闭原则和里氏替换原则往往是生死相依、不弃不离的,通过里氏替换来达到对扩展开放,对修改关闭的效果。

    相关文章

      网友评论

          本文标题:里氏替换原则

          本文链接:https://www.haomeiwen.com/subject/wngdnqtx.html