三:里氏替换原则(Liskov Substitution Principle)
定义:所有引用基类的地方都必须能透明地使用其子类的对象举个例子:Android中的Windows与View的关系
![面向对象的六大原则(三)-- 里氏替换原则 面向对象的六大原则(三)-- 里氏替换原则](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9hSFIwY0RvdkwybHRaeTVpYkc5bkxtTnpaRzR1Ym1WMEx6SXdNVFl3TVRJMU1Ea3pOVFU0T1RnNVAzZGhkR1Z5YldGeWF5OHlMM1JsZUhRdllVaFNNR05FYjNaTU1rcHpZakpqZFZrelRtdGlhVFYxV2xoUmRpOW1iMjUwTHpWaE5rdzFUREpVTDJadmJuUnphWHBsTHpRd01DOW1hV3hzTDBrd1NrSlJhMFpEVFVFOVBTOWthWE56YjJ4MlpTODNNQzluY21GMmFYUjVMME5sYm5SbGNnPT0%3D.jpg?w=700&webp=1)
代码如下:
//窗口类
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){
//测量视图大小,具体代码省略
}
}
//View子类,Button
public class Button extends View{
public void draw(){
//绘制按钮。。。
}
}
//View子类,TextView
public class TextView{
public void draw(){
//绘制文本。。。
}
}
Window依赖于View,View定义了视图抽象,measure是各个子类共享的类,具体的draw交给其子类去实现。任何继承自View类的子类都可以设置给show方法,这就是里氏替换原则。这样就可以产生千变万化的View,而且可以统一传递给Window来进行管理并展示在屏幕上。
在上一篇的代码也很好地反映了该原则,即MemoryCache、DiskCache、DoubleCache都可以替换ImageCache的工作,并且能够保证行为的正确性。ImageCache建立了获取缓存图片、保存缓存图片的接口规范,MemoryCache等根据接口规范实现了相应的功能,用户只需要在使用时指定具体的缓存对象就可以动态地替换ImageLoader中的缓存策略。这就使得ImageLoader的缓存系统具有了无线的可能性,也就是保证了可扩展性。