Solid五大设计原则

Posted by Wh0ami-hy on January 9, 2024

1. SOLID

SOLID 原则是用来指导软件设计的,它一共分为五条设计原则,分别是:

  • 单一职责原则(SRP)
  • 开闭原则(OCP)
  • 里氏替换原则(LSP)
  • 接口隔离原则(ISP)
  • 依赖倒置原则(DIP)

2. SRP

单一职责原则(Single Responsibility Principle)简单地说:接口职责应该单一,不要承担过多的职责。单一职责适用于接口、类,同时也适用于方法

我们在设计一个类的时候,可以先从粗粒度的类开始设计,等到业务发展到一定规模,我们发现这个粗粒度的类方法和属性太多,且经常修改的时候,我们就可以对这个类进行重构了,将这个类拆分成粒度更细的类,这就是所谓的持续重构

3. OCP

开闭原则(Open Closed Principle),简单地说:就是当别人要修改软件功能的时候,使得他不能修改我们原有代码,只能新增代码实现软件功能修改的目的。

比如,一个做饭的处理程序,做不同的饭用到不同的处理方式,代码如下

if(type == "米饭"){
    //deal with 米饭
} else if (type == "面条"){
    //deal with 面条
} else if (type == ......){
    //......
}

如果以后还需要做其他饭,那么就会在后面加上很多 if else 语句,最终会让整个方法变得又臭又长

如果我们对做饭这件事情做一个抽象,做米饭的过程是一个具体的实现,做面条是一个具体的实现,那么写出的代码会是这样的:

public interface DealFood {
    void dealFood();
}

public class Rice implement DealFood{
    void dealFood(){
        //deal with Rice
    }
}

public class Noodles implement DealFood{
    void dealFood(){
        //deal with Noodles
    }
}

public class DealFoodFactory{
    private Map<String, DealFood> map = new HashMap();

    private init(){
        //init all the Class that implements DealFood interface 
      }
}

.....

public static void main(){
    String type = "Rice";
    DealFood dealFood = DealFoodFactory.getdealFood(type);  //get RiceDealFoodClass Instance.
    dealFood.dealFood();
}

上面这种实现方式使得别人无法修改我们的代码,为什么?

因为当需要做米饭的时候,他会发现他只能新增一个类实现 DealFood 接口,而无法再原来的代码上修改。这样就实现了「对拓展开放,对修改封闭」的原则。

4. LSP

里氏替换原则(Liskov Substitution Principle),简单地说:所有父类能出现的地方,子类就可以出现,并且替换了也不会出现任何错误。

重点强调:对使用者来说,能够使用父类的地方,一定可以使用其子类,并且预期结果是一致的

Parent obj = new Son();
等价于
Son son  = new Son();

这就要求子类重写父类的所有相同方法时,都必须遵循父类的约定,否则当父类替换为子类时就会出错。

5. ISP

接口隔离原则(Interface Segregation Principle),简单地说:接口的内容一定要尽可能地小,能有多小就多小。不要将一个大而全的接口扔给使用者,而是将每个使用者关注的接口进行隔离

比如,我们提供的一个接口中包含1、2、3、4、5个方法,调用方A只调用1、2、3方法,调用方B只调用4、5方法,接口隔离原则的意思是,你应该把 1、2、3 抽离出来作为一个接口,4、5 抽离出来作为一个接口,这样接口之间就隔离开来了。

6. DIP

依赖倒置原则(Dependence Inversion Principle),简单地说,就是说我们应该面向接口编程。通过抽象成接口,使各个类的实现彼此独立,实现类之间的松耦合。DIP 提倡使用者依赖一个抽象的服务接口,而不是去依赖一个具体的服务执行者,从依赖具体实现转向到依赖抽象接口。

7. SOLID的本质

简单地说:依赖倒置原则告诉我们要面向接口编程。当我们面向接口编程之后,接口隔离原则和单一职责原则又告诉我们要注意职责的划分,不要什么东西都塞在一起。当我们职责捋得差不多的时候,里氏替换原则告诉我们在使用继承的时候,要注意遵守父类的约定。而上面说的这四个原则,它们的最终目标都是为了实现开闭原则

16108948449641


本站总访问量