设计模式六大原则--里氏代换原则

       背景

       上一篇我总结了一下依赖倒转原则,查了很多资料发现凡总结依赖倒转原则的时候,大多数人也会把里氏代换原则顺道也给总结了。Why?还是让我们先来看看里氏代换原则(Liskov Substitution Principle, LSP)吧。

       定义

       Functions that use pointers or referencesto base classesmust be able to use objects of derived classes without knowingit.(子类型必须能够替换掉它们的父类型。)

       详细说明

       通俗的将就是一个软件实体如果使用的是一个父类的话,那么一定使用于其子类,而且它觉察不出父类对象和子类对象的区别。也就是说,在软件里,把父类都替换成他的子类,程序的行为没有变化。

       示例

       例1:比方说,猫是继承动物类以动物的身份拥有吃、喝、跑、叫等行为,当某一天我们需要猪、牛、羊也拥有类似的行为,由于它们都集成动物,所以处理更改实例化的地方,程序其他处不需要改变。

                  

(ps:正是由于里氏代换原则,才使得开放-封闭成为可能)

       例2:里氏代换原则是倒转依赖原则的基础,由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展。

                                
  

(ps:这里有更加详细的例子http://blog.csdn.net/fangaoxin/article/details/6717233

       优劣

       优点

       代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;提高代码的重用性; 提高代码的可扩展性;提高产品或项目的开放性。

       缺点

       继承是侵入性的。只要继承,就必须拥有父类的所有属性和方法;降低代码的灵活性。子类必须拥有父类的属性和方法,让子类自由的世界中多了些约束;增强了耦合性。当父类的常量、变量和方法被修改时,必需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能带来非常糟糕的结果——大片的代码需要重构。

(更优秀的文章:http://wenku.baidu.com/link?url=_Gm0QpDzm8sNJvJ0N3LsHhx-Ooot4OPV4N6C7MVQR1ficR09SxOlq4IT6GrweUHg9hWnDOvdz3_LOWLTNIprv1dNiagqdCvy_Y8x0p0yjiK)

 

时间: 2024-08-17 21:55:43

设计模式六大原则--里氏代换原则的相关文章

设计模式六大原则 里氏替换原则

设计模式六大原则(2):里氏替换原则 是不是有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑其实原因就是这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的. 2002年,软件工程大师Robert C. Martin,出版了一本<Agile Software Development Principles Patterns and Practices>,在文中他把里氏代换原则最终简化为一句话: "Subtypes must b

举例解析Java的设计模式编程中里氏替换原则的意义_java

里氏替换原则,OCP作为OO的高层原则,主张使用"抽象(Abstraction)"和"多态(Polymorphism)"将设计中的静态结构改为动态结构,维持设计的封闭性."抽象"是语言提供的功能."多态"由继承语义实现. 里氏替换原则包含以下4层含义: 子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法. 子类中可以增加自己特有的方法. 当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更

设计模式六大原则——里氏替换原则(LSP)

       概述        里氏替换原则(LSP,Liskov Substitution Principle)是关于继承机制的原则,是实现开放封闭原则的具体规范,违反了里氏替换原则必然违反了开放封闭原则.        引经据典                        约瑟夫.斯大林,苏联时期苏联共产党的最高领导人,对于斯大林有没有替身?有几个替身?有一种说法:斯大林有好几个替身,最著名的当属"第一替身"叶夫谢伊.卢比茨基--他"扮演"领袖斯大林长达15

设计模式之禅之六大设计原则-里氏替换原则

里氏替换原则说的就是面向对象语言的继承--->代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性.--->提高代码的重用性.--->子类可以形似父类,但又特殊于父类.--->提高代码的可扩展性.实现父类的方法,可以为所欲为.许多开源框架的接口都是继承父类完成的.--->提高产品或项目的开放性.--->继承是侵入性的.子类必须拥有父类的属性和方法.让子类自由的世界中多了些约束.--->增强了耦合性.当父类的常量,变量和方法被修改时,需要考虑子类的修改.造成

设计模式学习:里氏替换原则

这节中我们会聊聊里氏替换原则,聊它之前,我们先看看定义. 定义:如果对每一个类型为T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型.(摘自java与模式一书) 如果你觉得定义说的模糊了点,不太清楚,没关系,我们慢慢说明白.里氏替换原则的另一个简短的定义是"所有引用基类的地方必须能透明地使用其子类的对象".这个可能更清楚点.如果你熟悉的掌握一门面向对

设计模式原则(单一、开放封闭、里氏代换、依赖倒转、迪米特法则五大原则)

原文:设计模式原则(单一.开放封闭.里氏代换.依赖倒转.迪米特法则五大原则) 单一职责原则 单一职责原则,就一个类而言,应该仅有一个引起它变化的原因.   如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,当变化发生时,设计会遭受到意想不到的破坏.事实上,我们完全可以找出来进行分类,分离.   软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离.其实要去判断是否应该分离出类来,也不难,那就是如果你能够想到多余一个的动机去改变

设计模式六大原则——合成/聚合复用原则(CARP)

   1.定义    简而言之,对于合成/聚合复用原则的定义就是:要尽量使用合成和聚合,尽量不要使用继承.           2.释义     为什么"要尽量使用合成和聚合,尽量不要使用继承"呢?      这是因为:      第一,继承复用破坏包装,它把父类的实现细节直接暴露给了子类,这违背了信息隐藏的原则:      第二:如果父类发生了改变,那么子类也要发生相应的改变,这就直接导致了类与类之间的高耦合,不利于类的扩展.复用.维护等,也带来了系统僵硬和脆弱的设计.而用合成和聚合

PHP设计模式——六大原则

      声明:本系列博客参考资料<大话设计模式>,作者程杰.      一般认为遵从以下六大原则的代码是易扩展可复用的代码:                                        这六大原则任何面向对象的语言都应该遵守的,要想让你的代码易扩展高服用就尽量去满足这六大原则吧,不一定严格按照某种设计模式,但是如果你的代码符合这六大原则,那么你的代码就是好代码了,好的代码不一定是严格按照设计模式写的代码.          1.单一职责         定义:不要存在多于

一句话评论设计模式六大原则

原文链接:http://www.cnblogs.com/lancidie/archive/2012/02/03/2337168.html        原则,故名思议则是本质的意思.所谓擒贼先擒王,研究设计模式自然要先了解设计原则,所有的模式都是在这些原则的基础之上发展起来的,有的是侧重一个,有的是多个都有所涉及.看完设计模式之后,我感觉到每个模式都有这些原则的影子,还渗透着面向对象的三大属性,也觉得这些原则也都有相通之处,,正是有了他们才使我们由代码工人转为艺术家.下面我来点评一下六大原则,望