- 里式替换原则的定义:
里式替换原则的定义多种定义,比较复杂,不易理解,比较容易理解的一种说法是:所有引用基类的
地方必须能透明地使用其子类对象。其实就是“抽象”,里式替换原则的定义就是对抽象的解释。我
们还是用例子来说明吧–Android 中window和view的关系。
UML图
- 简单例子代码
**
* 窗口类,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的重要思想–抽象。抽象是优化代码重要的一步。

本文通过Android中的window和view关系示例,详细解读了里式替换原则,即所有引用基类的地方必须能透明地使用其子类对象。通过实例演示了如何通过抽象建立规范,并在运行时替换掉抽象,确保系统具备良好的扩展性和灵活性。
6191

被折叠的 条评论
为什么被折叠?



