里氏替换原则,所有引用基类的地方必须能透明的使用其子类的对象。里氏替换原则依赖于继承、多态这2大特性。通俗点讲,就是只要父类能出现的地方子类就可以出现,而去替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是反过来就不行了,有子类出现的地方,父类未必就能适应。说了那么多,其实最终总结就2个字:抽象。
例子代码如下:
package com.example.yangshin99.myapplication;
import android.view.View;
/**
* Created by yangshin99 on 16/2/16.
* 窗口类
*/
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 Button extends View{
@Override
public void draw() {
//绘制按钮
}
}
//TextView的具体实现
public class TextView extends View{
@Override
public void draw() {
//绘制文本
}
}
上述示例中,Window依赖于View,而View定义了视图抽象,measure是各个子类共享的方法,子类通过覆写View的draw方法实现各具特色的功能,在这里,这个功能就是绘制自身的内容。任何继承自View类的子类都可以设置给show方法,就是所说的里氏替换。通过里氏替换,就可以自定义各种各样、千变万化的View,然后传递给window。
里氏替换原则的核心原理是抽象,抽象又依赖于继承。在代码实现中,里氏替换又有多态。里氏原则指导我们构建更好的软件系统。里氏替换原则就是为ImageLoader使用不同缓存策略这类问题提供指导原则,也就是建立抽象,通过抽象建立规范,具体的实现在运行时替换掉抽象,保证系统的扩展性、灵活性。开放-关闭原则和里氏替换原则往往生死相依,不离不弃。通过里氏替换原则来达到对扩展开放,对修改关闭的效果。这2个原则都强调一个重要特性-抽象。因此,在开发过程中,运用抽象时走向代码优化的重要一步。