单一职责原则
基本介绍
Simple Responsibility Principle(SRP)一个类或者模块只负责完成一个职责(或者功能)
如何理解单一职责原则?
类和模块的两种理解:
- 把模块看作比类更加抽象饿概念,类也可以看作模块
- 把模块看作壁垒更加粗粒度的代码快,模块中包含多个类,多个类组成一个模块
如何判断类的职责是否单一?
- 类中代码行数、函数或属性过多
- 类依赖的其他类过多,或者依赖类的其他类过多,不符合高内聚、低耦合的设计思想
- 私有方法过多
- 比较难给类一个合适的名字,很难用一个业务名称概括,或者只能用一些笼统的Manager、Context之类的词语来命名
- 类中大量的方法都是操作类中的几个属性
类的职责是否设计的越单一越好?
不是。不管是应用设计原则还是设计模式,最终的目的还是提高代码的可读性、可扩展性、复用性、可维护性
应用实例
以交通工具类为例
class Vehicle{
public void run(String vehicle){
System.out.println(vehicle+" 在公路上运行...")
}
}
public class SingleResponsibility01 {
public static void main(String[] args) {
Vehicle vehicle=new Vehicle();
vehicle.run("摩托车");
vehicle.run("汽车");
vehicle.run("飞机");
}
}
注: 在方式1中的run方法中,违反了单一职责原则
解决方式
- 根据交通工具运行方法不同,分解成不同的类
public class SingleResponsibility02 {
public static void main(String[] args) {
RoadVehicle roadVehicle = new RoadVehicle();
roadVehicle.run("摩托车");
roadVehicle.run("汽车");
AirVehicle airVehicle = new AirVehicle();
airVehicle.run("飞机");
}
}
/**
* 1.遵守单一职责原则
* 2.但是这样做的改动太大,即将类分解,同时修改客户端
* 3.改进:直接修改Vehicle类,改动代码会比较小=》方案三
*/
class RoadVehicle {
public void run(String vehicle) {
System.out.println(vehicle + "公路运行");
}
}
class AirVehicle {
public void run(String vehicle) {
System.out.println(vehicle + "天空运行");
}
}
class WaterVehicle {
public void run(String vehicle) {
System.out.println(vehicle + "水中运行");
}
}
- 根据交通工具运行方法不同,在交通工具类中增加不同的方法
public class SingleResponsibility03 {
public static void main(String[] args) {
Vehicle03 vehicle = new Vehicle03();
vehicle.runAir("飞机");
vehicle.runRoad("汽车");
vehicle.runWater("轮船");
}
}
//方式3的分析
//1. 这种修改方法没有对原来的类做大的修改,只是增加方法
//2. 这里虽然没有在类这个级别上遵守单一职责原则,但是在方法级别上,仍然是遵守单一职责
class Vehicle03 {
public void runRoad(String vehicle) {
System.out.println(vehicle + "在公路上运行……");
}
public void runAir(String vehicle) {
System.out.println(vehicle + "在空中运行……");
}
public void runWater(String vehicle) {
System.out.println(vehicle + "在水中运行……");
}
}
注: 以上两种解决方式没有好坏之分,只是关注粒度不同,实际应用中应根据情况,选择合适的粒度