您当前的位置:首页 > 计算机 > 编程开发 > 设计模式

【设计模式】3.设计模式原则-里式替换原则

时间:02-01来源:作者:点击数:

一、原则:

  继承必须确保超类所拥有的性质在子类中仍然成立。子类可以扩展父类的功能,但不能改变父类原有的功能。子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。

二、作用:

  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;
    }
}
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门