JAVA单一职责原则

来源:互联网 发布:jubeat 知乎 编辑:程序博客网 时间:2024/05/02 12:34

    单一职责原则(SRP:Single responsibility principle)又称单一功能原则,面向对象五个基本原则(SOLID)之一。它规定一个类应该只有一个发生变化的原因。

      单一职责原则是最简单的面对对象设计原则,它用于控制类的粒度大小。
在软件系统中,一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小,而且一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的运作,因此要将这些职责进行分离,将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中,如果多个职责总是同时发生改变则可将它们封装在同一类中。
      我们写程序的目标就是 高内聚 低耦合!什么叫高内聚低耦合呢,举个例子:你房子里边有墙和窗 ,那墙和窗就有了关联,耦合度 是松还是紧 就看你的 关联 是强还是弱,也就是修改的代价,比如 你窗是扣死在墙里的 那么你修改窗子就必须修改墙 这就比较紧密了,但是如果你窗是按照某种规格的 可以自由拆装的 那么修改的代价就小,耦合度也就低了。


举例说明,用一个类描述动物呼吸这个场景:

class Animal{
  
    public void breathe(String animal){
  
        System.out.println(animal+"呼吸空气");
  
    }
  
}
  
public class Client{
  
    public static void main(String[] args){
  
        Animal animal = new Animal();
  
        animal.breathe("牛");
  
        animal.breathe("羊");
  
        animal.breathe("猪");
  
    }
  
}  


运行结果:
牛呼吸空气
羊呼吸空气
猪呼吸空气

程序上线后,发现问题了,并不是所有的动物都呼吸空气的,比如鱼就是呼吸水的。修改时如果遵循单一职责原则,需要将Animal类细分为陆生动物类Terrestrial,水生动物Aquatic:

class Terrestrial{
  
    public void breathe(String animal){
  
        System.out.println(animal+"呼吸空气");
  
    }
  
}
  
class Aquatic{
  
    public void breathe(String animal){
  
        System.out.println(animal+"呼吸水");
  
    }
  
}
  
public class Client{
  
    public static void main(String[] args){
  
        Terrestrial terrestrial = new Terrestrial();
  
        terrestrial.breathe("牛");
  
        terrestrial.breathe("羊");
  
        terrestrial.breathe("猪");
  
        Aquatic aquatic = new Aquatic();
  
        aquatic.breathe("鱼");
  
    }
  }  

运行结果:
牛呼吸空气
羊呼吸空气
猪呼吸空气
鱼呼吸水

遵循单一职责原的优点有:
1.可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
2.提高类的可读性,提高系统的可维护性;
3.变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。

单一职责原则虽然它是最简单但又最难运用的原则,需要设计人员发现类的不同职责并将其分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关实践经验。

0 0
原创粉丝点击