【设计模式】3.设计模式原则-里式替换原则
作者:互联网
一、原则:
继承必须确保超类所拥有的性质在子类中仍然成立。子类可以扩展父类的功能,但不能改变父类原有的功能。子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。
二、作用:
1.里式替换原则是实现开闭原则的重要方式之一。
2.它克服了继承中重写父类造成的可复用性变差的缺点。
3.它是动作正确性的保证。即类的扩展不会给已有的系统引入新的错误,降低了代码出错的可能性。
4.加强程序的健壮性,同时变更时可以做到非常好的兼容性,提高程序的维护性,可扩展性,降低需求变更时引入的风险。
三、实现方式:
1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法
2.子类中可以增加自己持有的方法
3.当子类的方法重载父类的方法时,方法的前置条件(即输入参数)要比父类的方法更宽松
4.当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即方法的输出/返回值)要比父类的方法更严格或相等。
四、涉及到哪些设计模式?
抽象工厂模式、工厂方法模式、简单工厂模式
五、示例:
父类:
public class Parent { public int calculate(int a, int b) { return a+b; } }
子类:
public class Child extends Parent { @Override public int calculate(int a, int b) { return a - b; } }
实现:
public class MainTest { public static void main(String[] args) { Parent c = new Child(); System.out.println("result1:" + c.calculate(1, 2)); Parent parent = new Parent(); System.out.println("result2:" + parent.calculate(1, 2)); } }
效果:
可以看到,虽然都是calculate方法,但是结果却不相同,原因是因为子类Child中将calculate方法覆写,导致结果有变化。在实际运用中,这个会使得调用逻辑混乱,相同方法一个相加另一个确实相减。如果子类是需要一个减法,应该是增加一个减法方法:
public class Child extends Parent { @Override public int calculate(int a, int b) { return super.calculate(a, b); } /** * 新增减法方法 * * @param a * @param b * @return */ public int subtraction(int a, int b) { return a - b; } }
标签:设计模式,calculate,原则,int,里式,子类,父类,方法,public 来源: https://www.cnblogs.com/catxx/p/16261894.html