设计模式原则(3)里氏替换原则

前端之家收集整理的这篇文章主要介绍了设计模式原则(3)里氏替换原则前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
第一种定义方式相对严格:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有变化,那么类型S是类型T的子类型。
/** 
 * 长方形类Rectangle: 
 * 
 */  
class Rectangle {  
  double length;  
  double width;  
  public double getLength() { return length; }   
  public void setLength(double height) { this.length = length; }     
  public double getWidth() { return width; }  
  public void setWidth(double width) { this.width = width; }   
}  

/** 
 * 正方形类Square: 
 */  
class Square extends Rectangle {  
  public void setWidth(double width) {  
    super.setLength(width);  
    super.setWidth(width);     
 }  
  public void setLength(double length) {   
    super.setLength(length);  
    super.setWidth(length);     
  }   
}  

由于正方形的度和宽度必须相等,所以在方法setLengthsetWidth中,对长度和宽度赋值相同。类TestRectangle是我们的软件系统中的一个组件,它有一个resize方法要用到基类Rectangleresize方法功能是模拟长方形宽度逐步增长的效果 :
测试类TestRectangle

class TestRectangle {  
  public void resize(Rectangle objRect) {  
    while(objRect.getWidth() <= objRect.getLength()  ) {  
        objRect.setWidth(  objRect.getWidth () + 1 );  
    }  
  }  
}  

我们运行一下这段代码就会发现,假如我们把一个普通长方形作为参数传入resize方法,就会看到长方形宽度逐渐增长的效果,当宽度大于长度,代码就会停止,这种行为的结果符合我们的预期;假如我们再把一个正方形作为参数传入resize方法后,就会看到正方形的宽度和长度都在不断增长,代码会一直运行下去,直至系统产生溢出错误。所以,普通的长方形是适合这段代码的,正方形不适合。
我们得出结论:在resize方法中,Rectangle类型的参数是不能被Square类型的参数所代替,如果进行了替换就得不到预期结果。因此,Square类和Rectangle类之间的继承关系违反了里氏代换原则,它们之间的继承关系不成立,正方形不是长方形。
优缺点:
在面向对象的语言中,继承是必不可少的、非常优秀的语言机制,它有如下优点:
1)代码共享,减少创建类的工作量,每个子类都拥有父类方法属性
2)提高代码的重用性;
3)子类可以形似父类,但又异于父类,“龙生龙,凤生凤,老鼠生来会打洞”是说子拥有父的“种”,“世界上没有两片完全相同的叶子”是指明子与父的不同;
4)提高代码的可扩展性,实现父类方法就可以“为所欲为”了,君不见很多开源框架的扩展接口都是通过继承父类来完成的;
5)提高产品或项目的开放性。
自然界的所有事物都是优点和缺点并存的,即使是鸡蛋,有时候也能挑出骨头来,继承的缺点如下:
1)继承是侵入性的。只要继承,就必须拥有父类的所有属性方法
2)降低代码的灵活性。子类必须拥有父类属性方法,让子类自由的世界中多了些约束;
3)增强了耦合性。当父类的常量、变量和方法修改时,必需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能带来非常糟糕的结果——大片的代码需要重构。

转载自:

原文链接:https://www.f2er.com/javaschema/286556.html

猜你在找的设计模式相关文章