依赖倒转原则(DiP)和里氏代换原则(LSP)
来源:互联网 发布:centos下php环境搭建 编辑:程序博客网 时间:2024/04/30 15:35
抽象不应该依赖于细节,细节应当依赖于抽象。 要针对接口编程,而不是针对实现编程。 传递参数,或者在组合聚合关系中,尽量引用层次高的类。 主要是在构造对象时可以动态的创建各种具体对象,当然如果一些具体类比较稳定,就不必再弄一个抽象类做它的父类,这样有画蛇添足的感觉。 优点: 系统扩展灵活。 缺点:
需要大量的类。
LSP讲的是基类和子类的关系。只有当这种关系存在时,里氏代换关系才存在。如果两个具体的类A,B之间的关系违反了LSP的设计,(假设是从B到A的继承关系)那么根据具体的情况可以在下面的两种重构方案中选择一种。
-----创建一个新的抽象类C,作为两个具体类的超类,将A,B的共同行为移动到C中来解决问题。
-----从B到A的继承关系改为委派关系。
为了说明,我们先用第一种方法来看一个例子,第二种办法在另外一个原则中说明。我们就看那个著名的长方形和正方形的例子。对于长方形的类,如果它的长宽相等,那么它就是一个正方形,因此,长方形类的对象中有一些正方形的对象。对于一个正方形的类,它的方法有个setSide和getSide,它不是长方形的子类,和长方形也不会符合LSP。
eg:
长方形类:
public class Rectangle{
...
setWidth(int width){
this.width=width;
}
setHeight(int height){
this.height=height
}
}
正方形类:
public class Square{
...
setWidth(int width){
this.width=width;
this. height=width;
}
setHeight(int height){
this.setWidth(height);
}
}
例子中改变边长的函数:
public void resize(Rectangle r){
while(r.getHeight()<=r.getWidth){
r.setHeight(r.getWidth+1);
}
}
那么,如果让正方形当做是长方形的子类,会出现什么情况呢?我们让正方形从长方形继承,然后在它的内部设置width等于height,这样,只要width或者height被赋值,那么width和height会被同时赋值,这样就保证了正方形类中,width和height总是相等的.现在我们假设有个客户类,其中有个方法,规则是这样的,测试传入的长方形的宽度是否大于高度,如果满足就停止下来,否则就增加宽度的值。现在我们来看,如果传入的是基类长方形,这个运行的很好。根据LSP,我们把基类替换成它的子类,结果应该也是一样的,但是因为正方形类的width和height会同时赋值,这个方法没有结束的时候,条件总是不满足,也就是说,替换成子类后,程序的行为发生了变化,它不满足LSP。
那么我们用第一种方案进行重构,我们构造一个抽象的四边形类,把长方形和正方形共同的行为放到这个四边形类里面,让长方形和正方形都是它的子类,问题就OK了。对于长方形和正方形,取width和height是它们共同的行为,但是给width和height赋值,两者行为不同,因此,这个抽象的四边形的类只有取值方法,没有赋值方法。上面的例子中那个方法只会适用于不同的子类,LSP也就不会被破坏。
在进行设计的时候,我们尽量从抽象类继承,而不是从具体类继承。如果从继承等级树来看,所有叶子节点应当是具体类,而所有的树枝节点应当是抽象类或者接口。当然这个只是一个一般性的指导原则,使用的时候还要具体情况具体分析。
- 依赖倒转原则(DiP)和里氏代换原则(LSP)
- 1、依赖倒转原则,2、里氏代换原则(LSP)
- 里氏代换和依赖倒转原则(二)
- 依赖倒转原则&里氏代换原则
- 依赖倒转原则,里氏代换原则
- 依赖倒转原则与里氏代换原则
- 依赖倒转原则/里氏代换原则
- 里氏代换原则(LSP)
- 里氏代换原则(LSP)
- LSP (里氏代换原则)
- 里氏代换原则(LSP)[csdn.iamxiaofeixia]
- 八,LSP(里氏代换原则)
- 依赖倒转原则——里氏代换原则
- 设计模式 依赖倒转原则 & 里氏代换原则
- 依赖倒转原则——里氏代换原则
- 大话设计模式05----依赖倒转原则 & 里氏代换原则
- 设计模式之依赖倒转原则---里氏代换原则
- 面向对象原则(3)(4):依赖倒转原则与里氏代换原则
- jsp字符乱码的处理
- ISP简介(ISP--Interface Segregation Principle)
- 详解GCC的下载和安装
- Welcome
- ExtJs在Eclipse中的环境配置
- 依赖倒转原则(DiP)和里氏代换原则(LSP)
- 一步一步设计你的数据库之数据库设计的重要性
- 输出上三角
- 让数据库变快的10个建议
- 复杂对象的组装与创建——建造者模式(三)
- 淘宝开网店提高店铺转化率的28原则
- JDK中设计模式
- Hypertable应用实践:比肩HBase
- 搜索引擎duckduckgo