设计模式-OOD的设计原则(2)-"里氏代换原则"

原创 2007年09月17日 23:14:00
从上一篇的"开-闭"原则中可以看出,面向对象设计的重要原则是创建抽象化,并且从抽象化导出具体化.这个导出要使用继承关系和一个原则:里氏代换原则(Liskov Substitution Principle, LSP).
      那么什么是里氏代换原则呢?有个严格的表述,绕口,不好记.还是比较白话的这个好记.说的是:一个软件实体如果使用的是一个基类的话,那么一定适用于其子类,而且它察觉不出基类对象和子类对象的区别.也就是说,在软件里面,把基类都替换成它的子类,程序的行为没有变化.
      LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为.
      下面,我们从代码重构的角度来对LSP进行理解.LSP讲的是基类和子类的关系.只有当这种关系存在时,里氏代换关系才存在.如果两个具体的类A,B之间的关系违反了LSP的设计,(假设是从B到A的继承关系)那么根据具体的情况可以在下面的两种重构方案中选择一种.
  1. 创建一个新的抽象类C,作为两个具体类的超类,将A,B的共同行为移动到C中来解决问题.
  2. 从B到A的继承关系改为委派关系.

      为了说明,我们先用第一种方法来看一个例子,第二种办法在另外一个原则中说明.我们就看那个著名的长方形和正方形的例子.对于长方形的类,如果它的长宽相等,那么它就是一个正方形,因此,长方形类的对象中有一些正方形的对象.对于一个正方形的类,它的方法有个setSide和getSide,它不是长方形的子类,和长方形也不会符合LSP.

      那么,如果让正方形当做是长方形的子类,会出现什么情况呢?我们让正方形从长方形继承,然后在它的内部设置width等于height,这样,只要width或者height被赋值,那么width和height会被同时赋值,这样就保证了正方形类中,width和height总是相等的.现在我们假设有个客户类,其中有个方法,规则是这样的,测试传人的长方形的宽度是否大于高度,如果满足就停止下来,否则就增加宽度的值.现在我们来看,如果传人的是基类长方形,这个运行的很好.根据LSP,我们把基类替换成它的子类,结果应该也是一样的,但是因为正方形类的width和height会同时赋值,这个方法没有结束的时候,条件总是不满足,也就是说,替换成子类后,程序的行为发生了变化,它不满足LSP.

      那么我们用第一种方案进行重构,我们构造一个抽象的四边形类,把长方形和正方形共同的行为放到这个四边形类里面,让长方形和正方形都是它的子类,问题就OK了.对于长方形和正方形,取width和height是它们共同的行为,但是给width和height赋值,两者行为不同,因此,这个抽象的四边形的类只有取值方法,没有赋值方法.上面的例子中那个方法只会适用于不同的子类,LSP也就不会被破坏.

      在进行设计的时候,我们尽量从抽象类继承,而不是从具体类继承.如果从继承等级树来看,所有叶子节点应当是具体类,而所有的树枝节点应当是抽象类或者接口.当然这个只是一个一般性的指导原则,使用的时候还要具体情况具体分析.

 

相关文章推荐

设计模式-OOD的设计原则(2)-"里氏代换原则"

转载:http://blog.csdn.net/kxy/archive/2005/06/28/406184.aspx  从上一篇的"开-闭"原则中可以看出,面向对象设计的重要原则是创建抽象化,并且从抽...
  • aimyton
  • aimyton
  • 2011年02月09日 09:58
  • 227

正方形不是矩形" << 【OOD设计原则之里氏替换原则(LSP)--- 设计模式之禅读书笔记

【OOD设计原则之里氏替换原则(LSP)】          ——"正方形不是矩形"  里氏替换原则(Liskov Substitutiion Principle,LSP)被称作继...

"围观"设计模式(2)--里氏替换原则(LSP,Liskov Substitution Principle)

在面向对象的程序设计中,里氏替换原则(Liskov Substitution principle)是对子类型的特别定义。它由芭芭拉·利斯科夫(Barbara Liskov)在1987年在一次会议上名为...

java设计模式_里氏代换原则

一、什么是里氏代换原则里氏代换原则(Liskov Substitution Principle): 一个软件实体如果使用的是一个父类的话,那 么一定适用于其子类,而且它察觉不出父类和子 ...

大话设计模式学习笔记(3,4,5)----单一职责,开放-封闭,依赖倒转,里氏代换原则

由于第3,4,5章讲的是设计模式里面的几个原则,没有讲具体的设计模式,所以我这里就把这三章放在一起写了。不过虽然篇幅短但是由于是原则,这些可是非常重要的。原则性的东西一只手都能数的过来,但是想要完全搞...

Java设计模式之二十八(里氏代换原则)

一、什么是里氏代换原则 里氏代换原则(Liskov Substitution Principle):一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类和子类对象的区别。也...

android设计模式之里氏代换原则(LSP)

里氏代换原则(LiskovSubstitution Principle,常缩写为LSP)。里氏代换原则由Barbara Liskov提出。...

设计模式六大原则(2):里氏代换原则

里氏代换原则(Liskov Substitution Principle) 里氏代换原则是由麻省理工学院(MIT)计算机科学实验室的Liskov女士,在1987年的OOPSLA大会上发表的一篇文章《...

设计模式之里氏转换原则

  • 2017年08月21日 22:56
  • 17KB
  • 下载

设计模式六大原则(2):里氏替换原则

肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑。其实原因就是这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的。 定义1:如果对每...
  • zhengzhb
  • zhengzhb
  • 2012年02月22日 08:46
  • 86017
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式-OOD的设计原则(2)-"里氏代换原则"
举报原因:
原因补充:

(最多只允许输入30个字)