S.O.L.I.O原则

252 阅读2分钟

Single responsibility principle 单一职责原则

一个类应该有且仅有一个去改变他的理由,这意味着一个类应该只有一项工作。

public class AreaCalculator {
    private float result;
    
    public float calculateArea(Shape s){
		//计算面积
    }

    public String printArea(){
		//打印面积
    }
}

这个类的作用应该是计算面积,不应该负责去打印面积,违反了单一职责原则

改进:

public class AreaCalculator {
    private float result;
    
    public float getResult(){
        return this.result;
    }
    public float calculateArea(Shape s){

    }
    
}

public class Printer{
    public String print(AreaCalculator as){
        System.out.println(as.getResult());
    }
}

Open close principle 开放封闭原则

对象或实体应该对扩展开放,对修改关闭

public class AreaCalculator {
    public float calculateArea(Triangle t){
		//打印三角形面积
    }
    
    public float calculateArea(Rectangle t){
		//打印矩形面积
    }
}

改进:

public class AreaCalculator {
    public float calculateArea(Shape s){

    }  
}

Liskov substitution principle 里氏替换原则

任何一个子类或者派生类用改可以替换它们的基类或父类

public class Shape{
    //打印体积
    abstract public float calculateVolumn();
    abstract  public float calculateArea();
}

public class Rectangle extends Shape{
    //矩形   矩形不能打印体积,所以不应该继承Shape类
}
public class Cube extends Shape{
        //正方体
}

interface segregation principle 接口分离原则

不应该强迫一个类实现它用不上的接口

public interface Shape{
    //打印体积
    abstract public float calculateVolumn();
    abstract  public float calculateArea();
}

public class Rectangle implements Shape{
    //矩形   矩形不能打印体积,所以不应该实现Shape接口
}
public class Cube implements Shape{
        //正方体
}

Dependency inversion principle 依赖反转原则

抽象不应该依赖于具体实现,具体实现应该依赖于抽象

public class AreaCalculator {
    private float result;
    
   public float getResult(){
       return this.result;
   }
   public float calculateArea(Shape s){
       if(s==Triangle){
           this.result=b * h / 2;
       }else if(s==Rectangle){
           this.result=l * w;
       }
   }

}

改进:

public interface Shape{
    public float getArea();
    
}

public class Triangle implements Shape{
    public float getArea(){
        return b * h / 2;
    }
}
public class AreaCalculator {
    private float result;

    public float getResult(){
        return this.result;
    }
    public float calculateArea(Shape s){
      this.result=s.getArea();
    }

}