设计模式六大原则--里氏代换原则
2014-02-17 13:55
176 查看
背景
上一篇我总结了一下依赖倒转原则,查了很多资料发现凡总结依赖倒转原则的时候,大多数人也会把里氏代换原则顺道也给总结了。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)
上一篇我总结了一下依赖倒转原则,查了很多资料发现凡总结依赖倒转原则的时候,大多数人也会把里氏代换原则顺道也给总结了。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)
相关文章推荐
- PHP无限级分类生成树实例代码
- 【转】Windows下搭建cvs服务器
- 最长时间
- BF-TECH-J2EE软件开发工程师就业班课程(风舞烟主讲)-10年IT从业经验结晶
- 设计模式六大原则--依赖倒转原则
- to disable the entity lazy load, The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
- TPKeyboardAvoidingScrollView 实现自动上滚,避免键盘遮盖住了textfield,textview等控件
- ASIHttpRequest-发送数据
- winrt xaml toolkit charts动态添加图表报Error HRESULT E_FAIL has been returned from a call to a COM componen
- Android到底哪个Acitivity启动
- tomcat linux startup.sh jdk配置
- java jvm 内存分配
- iOS 真机调试
- 2.17
- lua
- php实现网页HTML标签补全方法
- ASIHttpRequest-创建和执行request
- Ext3.2.2 表格随窗口改变动态适应窗体大小
- ThinkPad X61 高分屏安装Win8.1,Ubuntu
- SVN(64位)报 Failed to load JavaHL Library. 的解决方法