开闭原则:
你写了一个代码,别人要来扩展它。如果满足了开闭原则,那个人是不需要更改你的代码及可以达到他的目的。
对扩展开放,对修改关闭;
里氏代换原则:
对开闭原则的补充
当一个方法调用基类时,调用子类能运行。比方来说:
两个基类:
1 //长方形类: 2 public class Rectangle{ 3 ... 4 setWidth(int width){ 5 this.width=width; 6 } 7 setHeight(int height){ 8 this.height=height 9 } 10 } 11 //正方形类: 12 public class Square{ 13 ... 14 setWidth(int width){ 15 this.width=width; 16 this. height=width; 17 } 18 setHeight(int height){ 19 this.setWidth(height); 20 } 21 }
方法:
1 public void resize(Rectangle r){ 2 while(r.getHeight()<=r.getWidth){ 3 r.setHeight(r.getWidth+1); 4 } 5 }
当方法中参数为基类时,运行正常,而当方法参数为子类时,发现会陷入无线循环中。则不满足LSP原则。
解决方法:
1:创建一个新的抽象类C,作为两个具体类的超类,将A,B的共同行为移动到C中来解决问题。
2:从B到A的继承关系改为委派关系。
合成/聚合复用原则:
只有当以下的条件全部被满足时,才应当使用继承关系。
1. 子类是超类的一个特殊种类,而不是超类的一个角色,也就是区分“Has-A”和“Is-A”.只有“Is-A”关系才符合继承关系,“Has-A”关系应当使用聚合来描述。
2 .永远不会出现需要将子类换成另外一个类的子类的情况。如果不能肯定将来是否会变成另外一个子类的话,就不要使用继承。
3 .子类具有扩展超类的责任,而不是具有置换掉或注销掉超类的责任。如果一个子类需要大量的置换掉超类的行为,那么这个类就不应该是这个超类的子类。
”Is-A”代表一个类是另外一个类的一种;而“Has-A”代表一个类是另外一个类的一个角色,而不是另外一个类的特殊种类(Is-A A继承B , Has-A A是B的组成部分。)
合成/聚合 编程使用方法:
1 class A{ 2 B b; 3 public void function(){ 4 } 5 }