里氏替换原则、依赖倒置原则(学习笔记)

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

 

【一】定义

如果对每一个类型为S的对象O1,都有类型为T的对象O2,使得以T定义的所有程序员P在所有的对象O1都代换成O2时,程序P的行为没有发生变化,那么类型S时类型T的子类型。直截了当的定义:所有引用基类的地方必须能透明地使用其子类对象。

我们知道,面向对象语言的三大特点时继承、封装、多态。里氏替换原则就是依赖于继承、多态这两大特性。通俗点讲

就是,只要父类能出现的地方子类就可以出现,使用者根本就不需要知道是父类还是子类,但是反过来就不行了,最终总结就是:抽象。

 

【二】例子

//窗口类

public class Window{

   public void show(View child){

      child.draw();

}

}

//建立视图抽象,测量试图的宽高为公用代码绘制实现交给具体的子类

public abstract class View{

     public abstact void draw();

     public void measure(int width,int height);

}

//按钮类的具体实现

public class Button extends Views{

   public void draw(){//绘制按钮}

}

 

//TextView的具体实现

public class TextView  extends Views{

public void draw(){//绘制文本};

}

上述示例中,Window依赖于View,而View定义了一个视图对象,measure个个哥子类共享的方法,子类通过复写View的draw方法实现具有各自特色的功能,在这里,这个功能就是绘制自身的内容,就可以自定义各式各样、千变万化的View,然后传递给Window,Window负责组织View,并将View现实到屏幕上。

里氏替换原则的核心原理是抽象,抽象又依赖于继承这个特性,在OOP当中,继承的优缺点都相当明显。

优点:

1.代码重用,减少创建类的成本,每个子类都有父类的方法和属性:

2.子类和父类基本相似,但又与父类有所区别;

3.提高代码的可扩展性。

继承的缺点:

1.继承是侵入性的,只要继承就必须拥有父类的所有属性和方法;

2.可能造成子类代码冗余、灵活性降低,因为子类必须拥有父类的属性和方法。

让项目拥有变化的能力-----------依赖倒置原则

【一】定义

依赖倒置原则指代了一种特定的解耦形式,使得高层次的模块不依赖于低层次的模块的实现细节的目的。

几个关键点:

1.高层模块不应该依赖于底层模块,两者都应该依赖于其抽象;

2.抽象不应该依赖于细节。

3.细节应该依赖抽象。

高层模块:调用端

抽象:接口或者抽象类

细节:实现类

依赖倒置原则在java语言中的表现就是:模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。一句话概括就是:面向接口编程,或者说面向抽象编程。

  如果类与类直接依赖于细节,那么他们之间就有直接的耦合,当实现需要发生变化时,意味着要同时修改依赖者的代码。

public class  ImageLoader{

//内存缓存(直接依赖于细节)

MemoryCache mMemoryCache =new MemoryCache();

}

这个就造成了高耦合,所以就有了后面的优化。。

 

 

 

你可能感兴趣的:(设计模式)