设计模式的目的

开闭原则:

  你写了一个代码,别人要来扩展它。如果满足了开闭原则,那个人是不需要更改你的代码及可以达到他的目的。

  对扩展开放,对修改关闭;

里氏代换原则:

  对开闭原则的补充

  当一个方法调用基类时,调用子类能运行。比方来说:

  两个基类:

 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 }
View Code

  方法:

1 public void resize(Rectangle r){
2 while(r.getHeight()<=r.getWidth){
3 r.setHeight(r.getWidth+1);
4 }
5 }
View Code

  当方法中参数为基类时,运行正常,而当方法参数为子类时,发现会陷入无线循环中。则不满足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 }
View Code

 

 

    

 

posted @ 2014-05-14 10:41  UCanBeFree  阅读(231)  评论(0)    收藏  举报