里氏替换准则

里氏替换准则英文全称是 Liskov Substitution Principle,缩写是 LSP。LSP 的第一种界说是:假如对每一个类型为 S 的目标 O1,都有类型为 T 的目标 O2,使得以 T 界说的一切程序 P 在一切的目标 O1 都代换成 O2 时,程序 P 的行为没有发生变化,那么类型 S 是类型 T 的子类型。上面这种描述确实不太好了解,咱们再看看另一个直截了当的界说。里氏替换准则第二种界说:一切引证基类的当地有必要能透明地运用其子类的目标。

咱们知道,面向目标的言语的三大特点是承继、封装、多态,里氏替换准则便是依赖于承继、多态这两大特性。里氏替换准则简单来说便是,一切引证基类的当地有必要能透明地运用其子类的目标。浅显点讲,只要父类能呈现的当地子类就可以呈现,而且替换为子类也不会发生任何过错或异常,运用者或许根本就不需求知道是父类仍是子类。但是,反过来就不行了,有子类呈现的当地,父类未必就能适应。说了那么多,其实最终总结就两个字:笼统。

比如

Android 中的 Window 与 View 的关系。

Android 构建扩展性更好的系统 —— 里氏替换原则

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 extends View {
   @Override
   public void draw() {
      // 制作文本
   }
}
public class ImageView extends View {
   @Override
   public void draw() {
      // 制作图片
   }
}

上述示例中,Window 依赖于 View,而 View 界说了一个视图笼统,measure 是各个子类共享的办法,子类经过覆写 View 的 draw 办法完成具有各自特色的功用,在这里,这个功用便是制作本身的内容。任何承继自 View 类的子类都可以传递给 show 函数,便是所说的里氏替换。经过里氏替换,就可以自界说各式各样、千变万化的 View,然后传递给 Window,Window 负责安排 View,而且将 View 显示到屏幕上。

总结

里氏替换准则的核心原理是笼统,笼统又依赖于承继这个特性,在 OOP 当中,承继的优缺点都相当明显。优点有以下几点:

(1)代码重用,减少创立类的本钱,每个子类都具有父类的办法和特点;

(2)子类与父类根本类似,但又与父类有所区别;

(3)进步代码的可扩展性

承继的缺点:

(1)承继是侵入性的,只要承继就有必要具有父类的一切特点和办法;

(2)或许造成子类代码冗余、灵活性降低,由于子类有必要具有父类的特点和办法。

事物总是具有两面性,怎么权衡利与弊都是需求根据详细情况来做出选择并加以处理。里氏替换准则指导咱们构建扩展性更好的软件系统,仍是接着前面的 ImageLoader 来做说明。

# Android 优化代码的第一步 —— 单一职责准则

# Android 让程序更安稳、更灵活 —— 开闭准则

Android 构建扩展性更好的系统 —— 里氏替换原则

图 1-2 所示也很好地反应了里氏替换准则,即 MemoryCache、DiskCache、DoubleCache 都可以替换 ImageCache 的工作,而且能够确保行为的正确性。ImageCache 树立了获取缓存图片、保存缓存图片的接口标准,MemoryCache 等根据接口标准完成了相应的功用,用户只需求在运用时指定详细的缓存目标就可以动态地替换 ImageLoader 中的缓存策略。这就使得 ImageLoader 的缓存系统具有了无限的或许性,也便是确保了可扩展性。

想象一种情况,当 ImageLoader 中的 setlmageCache(ImageCachecache) 中的 cache 目标不能够被子类所替换,那么用户怎么设置不同的缓存目标,以及用户怎么自界说自己的缓存完成?里氏替换准则就为这类问题供给了指导准则,也便是树立笼统,经过笼统树立标准,详细的完成在运行时替换掉笼统,确保系统的扩展性、灵活性。

开闭准则和里氏替换准则往往是生死相依、不弃不离的,经过里氏替换来达到对扩展开放,对修改封闭的效果。然而,这两个准则都一起强调了一个 OOP 的重要特性 —— 笼统,因此,在开发过程中运用笼统是走向代码优化的重要一步。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。