这是我参与8月更文挑战的第21天,活动详情查看:8月更文挑战
里氏替换原则
对象的三大特征封装,继承,多态
其中继承: 能够提高代码的复用性,可扩展性(上一篇文章中提到的开闭原则中的例子可以体现),但是继承越多越好吗?当然不是,一旦有继承就可以获得父类的所有方法和属性(非私有),在一定程度上会对子类有约束;同时父类一旦要修改 对子类就有可能会产生影响(增强了耦合性);
那么里氏替换原则可以在一定程度避免继承中的缺点,那什么是里氏替换原则,先看一段代码:
public class A {
public int fun1(int a,int b){return a-b;}
}
public class B extends A{
public int fun1(int a,int b){return a+b;}
public int fun2(int a,int b){return fun1(a,b)+8;}
}
public class Test {
public static void main(String[] args) {
A a = new A();
System.out.println("11-3="+a.fun1(11,3));
System.out.println("1-8="+b.fun1(1,8));
B b = new B();
System.out.println("11-3="+b.fun1(11,3)); //这里本意是想求11-3
System.out.println("1-8="+b.fun2(1,8));
}
}
看上面代码的运行结果是:8 -7 14 9 B类继承了A的fun1的方法,原本在b.fun1(11,3)本意是想求11-3,结果修改了A类原来的方法 边为求11+3,我们从上面分享的继承,一旦父类修改对子类会有影响。如果继承多了,那结果也是不可想象的。而在编程过程中则可以多考虑里式替换原则
即:子类可以扩展父类的功能,但不能改变父类的功能。在使用继承时,在子类中尽量不要重写父类的方法。我们从里式替换原则可以看出,继承实际上让类之间的耦合性加强了,既然这样,我们在适当情况下,可以通过聚合,组合,依赖来解决问题。 这样遵循上面的思想,我们可以对代码进行改造:
//添加一个更基本的类
public class Base { }
public class A extends Base{
public int fun1(int a,int b){return a-b;}
}
public class B extends Base{
private A a = new A();
public int fun1(int a,int b){return a+b;}
public int fun2(int a,int b){return fun1(a,b)+8;}
public int fun3(int a,int b){return this.a.fun1(a,b);}
}
分析上面的代码,若对A做修改 则不会影响B中原来有的方法fun1 和 fun2 总而言之,里式替换原则在子类中尽量不要重写父类的方法(并不是说不要继承)
接口隔离原则
其基本意思就是一个类对另一个类的依赖应该建立在最小的接口之上。看如图:
接口隔离原则很好理解,就是把一个大接口拆分成多个小接口,把对接口的依赖划分到最小接口上