六大设计原则之里式替换原则

本文通过Android中的window和view关系示例,详细解读了里式替换原则,即所有引用基类的地方必须能透明地使用其子类对象。通过实例演示了如何通过抽象建立规范,并在运行时替换掉抽象,确保系统具备良好的扩展性和灵活性。
  • 里式替换原则的定义:
    里式替换原则的定义多种定义,比较复杂,不易理解,比较容易理解的一种说法是:所有引用基类的
    地方必须能透明地使用其子类对象。其实就是“抽象”,里式替换原则的定义就是对抽象的解释。我
    们还是用例子来说明吧–Android 中window和view的关系。
    UML图
    LWindow和LView的关系
  • 简单例子代码
**
* 窗口类,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的重要思想–抽象。抽象是优化代码重要的一步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值