设计模式 -- 七大原则(一)-- 单一职责原则

发布于:2024-08-21 ⋅ 阅读:(77) ⋅ 点赞:(0)

1 定义

        单一职责原则(Single Responsibility Principle,简称SRP)建议一个类或模块应该只负责一项职责。当需要修改一个功能时,只有一个原因会促使我们去修改它。

        所谓职责,在这里指的是类所承担的功能或行为。如果一个类负责多个职责,那么当其中某个职责需要变更时,可能会影响其他职责的正常运作,从而导致系统的稳定性和可维护性降低。因此,单一职责原则强调一个类应该只负责一项职责,从而确保系统的健壮性和可扩展性。

2 关键要素

  • 职责清晰:一个类的职责应该是清晰且具体的。比如,一个负责用户验证的类就不应该同时处理用户的数据存储。
  • 封装性:单一职责原则鼓励将功能封装在独立的类或模块中,这有助于功能的复用和维护。
  • 灵活性与可扩展性:遵循单一职责原则的代码更容易扩展。因为一个类的功能单一,添加新功能或修改现有功能时,对其他代码的影响较小。
  • 防止耦合:避免了一个类或模块同时处理多个职责,减少了不同职责之间的耦合,使得代码更易于管理。

3 实例

3.1 目标

        假设有一个名为“Vehicle”的类,既负责陆地交通工具如汽车,又负责空中交通工具如飞机的运行方式。这样的设计显然违反了单一职责原则,因为当交通工具运行方式发生变化时,必须修改这个类,增加了出错的风险。按照单一职责原则,应将交通工具类拆分为“LandVehicle”和“AirVehicle”等,每个类分别负责各自领域内的运行方式。

3.2 方案1

public class SingleResponsibility1 {
    public static void main(String[] args) {
    	Vehicle vehicle = new Vehicle(); 
        vehicle.run("摩托车");
		vehicle.run("汽车");
		vehicle.run("飞机");
    }
}

//  方案1
//  交通工具类
class Vehicle {
	public void run(String vehicle) {
        System.out.println(vehicle + " 在公路上运行	");
	}
}

1. 在方式 1 的 run 方法中,违反了单一职责原则
2. 解决的方案非常的简单,根据交通工具运行方法不同,分解成不同类即可

3.3 方案2

public class SingleResponsibility2 {
    public static void main(String[] args) {
        RoadVehicle roadVehicle = new RoadVehicle(); 
        roadVehicle.run("摩托车");
		roadVehicle.run("汽车");

		AirVehicle airVehicle = new AirVehicle();
		airVehicle.run("飞机");
	}
}


// 方案 2 
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 + "水中运行");
	}
}

1. 遵守单一职责原则
2. 但是这样做的改动很大,即将类分解,同时修改客户端

3.4 方案3

public class SingleResponsibility3 {
    public static void main(String[] args) {
        Vehicle2 vehicle2	= new Vehicle2();
        vehicle2.run("汽车"); 
        vehicle2.runWater("轮船");
        vehicle2.runAir("飞机");
    }
}

// 方式 3
class Vehicle2 {
	public void run(String vehicle) {
		System.out.println(vehicle + " 在公路上运行	");
    }
    public void runAir(String vehicle) {
        System.out.println(vehicle + " 在天空上运行	");
    }
    public void runWater(String vehicle) { 
        System.out.println(vehicle + " 在水中行	");
    }
}

1. 这种修改方法没有对原来的类做大的修改,只是增加方法
2. 这里虽然没有在类这个级别上遵守单一职责原则,但是在方法级别上,仍然是遵守单一职责

4 注意事项和细节

  • 降低类的复杂度:一个类只负责一项职责,逻辑会比负责多项职责的类简单得多。
  • 提高类的可读性:职责单一使代码更加清晰易懂,其他开发者可以更快地理解类的功能和作用。
  • 提高系统的可维护性:通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则。
  • 变更引起的风险降低:遵循单一职责原则能够减少因修改带来的风险,确保系统的稳定性和可靠性。

5 总结

        单一职责原则是面向对象设计中的一个核心原则,它鼓励开发者将复杂的系统分解为多个小而专的模块,每个模块负责一个职责。这样做不仅提高了代码的可维护性、可读性和可扩展性,还降低了代码的复杂性和出错的概率。


网站公告

今日签到

点亮在社区的每一天
去签到