一、简单介绍(百度)
单一职责原则(SRP:Single responsibility principle)又称单一功能原则,面向对象五个基本原则(SOLID)之一。它规定一个类应该只有一个发生变化的原因。该原则由罗伯特·C·马丁(Robert C. Martin)于《敏捷软件开发:原则、模式和实践》一书中给出的。马丁表示此原则是基于汤姆·狄马克(Tom DeMarco)和Meilir Page-Jones的著作中的内聚性原则发展出的。所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。
二、多职责问题
一个类,只有一个引起它变化的原因。应该只有一个职责。每一个职责都是变化的一个轴线,如果一个类有一个以上的职责,这些职责就耦合在了一起。这会导致脆弱的设计。当一个职责发生变化时,可能会影响其它的职责。另外,多个职责耦合在一起,会影响复用性。
三、案例
1、代码一
package com.hao.demo.design.singleResponsbility;
/**
* 方案一、 交通工具共用一个方法
* @author haoxiansheng
* @date 2020-05-11
*/
public class SingleResponseblilityTest {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.run("摩托车");
vehicle.run("轮船");
vehicle.run("飞机");
}
}
// 车
class Vehicle {
/**
* 违反单一职责原则 这个是举例可能不是完全对
* @param vehicle
*/
public void run(String vehicle) {
System.out.println(vehicle + "在马路上运行、、、、");
}
}
2、代码二
package com.hao.demo.design.singleResponsbility;
/**
* 方案二 建三个类 分别执行对应的
* 问题、 虽然是单一职责原则 改动大
* @author haoxiansheng
* @date 2020-05-11
*/
public class SingleResponsebilityTest2 {
public static void main(String[] args) {
RoadVehicle roadVehicle = new RoadVehicle();
roadVehicle.run("汽车");
WaterVehicle waterVehicle = new WaterVehicle();
waterVehicle.run("轮船");
AirVehicle airVehicle = new AirVehicle();
airVehicle.run("飞机");
}
}
class RoadVehicle {
/**
* 公路
* @param vehicle
*/
public void run(String vehicle) {
System.out.println(vehicle + "在公路上运行、、、、");
}
}
class WaterVehicle {
/**
* 水中
* @param vehicle
*/
public void run(String vehicle) {
System.out.println(vehicle + "在水上运行、、、、");
}
}
class AirVehicle {
/**
* 空中
* @param vehicle
*/
public void run(String vehicle) {
System.out.println(vehicle + "在天上运行、、、、");
}
}
3、代码三
package com.hao.demo.design.singleResponsbility;
/**
* 方案三 、修改 Vehicle2
* 1、没有对原来的类做大的修改
* 2、方法级别遵守单一职责原则
* 3、类上没有遵守
* @author haoxiansheng
* @date 2020-05-11
*/
public class SingleResponsebilityTest3 {
public static void main(String[] args) {
Vehicle2 vehicle2 = new Vehicle2();
vehicle2.run("汽车");
vehicle2.runAir("飞机");
vehicle2.runWater("轮船");
}
}
class Vehicle2{
/**
* 公路
* @param vehicle
*/
public void run(String vehicle) {
System.out.println(vehicle + "在公路上运行、、、、");
}
/**
* 水中
* @param vehicle
*/
public void runWater(String vehicle) {
System.out.println(vehicle + "在水上运行、、、、");
}
/**
* 空中
* @param vehicle
*/
public void runAir(String vehicle) {
System.out.println(vehicle + "在天上运行、、、、");
}
}
四、小结
1、单一职责原则降低类的复杂度,一个类只负责一项职责
2、提高类的可读性、可维护性
3、降低后续维护的复杂性
4、一般情况下要遵守单一职责原则,除非逻辑特别简单、类中方法特别少