构建扩展性更好的系统---里氏替换原则
【一】定义
如果对每一个类型为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();
}
这个就造成了高耦合,所以就有了后面的优化。。