基本介绍
对类来说,即一个类应该只负责一项职责。如类 A 负责两个不同职责:职责 1,职责 2,当职责 1 需要变更而改变 A 时,可能造成职责 2 执行错误,所以需要将类 A 分解为 A1,A2
实例演示
我们建立一个交通(Vehicle
)类,并交通工具的运行方法
方式一
public class SingleResponsibility1 {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.run("摩托车");
vehicle.run("汽车");
vehicle.run("飞机");
}
}
class Vehicle {
public void run (String vehicle){
System.out.println(vehicle + "在公路上运行");
}
}
运行结果:
/*
摩托车在公路上运行
汽车在公路上运行
飞机在公路上运行 // 明显不正确
*/
分析方式一
在方式一中的 run
方法中,违反了单一职责原则
解决方案,根据交通工具运行方法不同,分解成不同类即可
方式二
public class SingleResponsibility2 {
public static void main(String[] args) {
RoadVehicle roadVehicle = new RoadVehicle();
roadVehicle.run("car");
AirVehicle airVehicle = new AirVehicle();
airVehicle.run("plan");
}
}
class RoadVehicle{
public void run(String vehicle){
System.out.println(vehicle + " in road running");
}
}
class AirVehicle{
public void run(String vehicle){
System.out.println(vehicle + " in fly sky");
}
}
运行结果:
/*
car in road running
plan in fly sky
*/
分析方式二
- 遵守单一职责原则
- 但是这样做的改动很大,即将类分解,同时修改客户端
- 改进:直接修改
Vehicle
类,改动代码会比较少
方式三
public class SingleResponsibility3 {
public static void main(String[] args) {
Vehicle2 vehicle2 = new Vehicle2();
vehicle2.runRoad("car");
vehicle2.runSea("fish");
vehicle2.runSky("plane");
}
}
class Vehicle2{
public void runSky(String vehicle){
System.out.println(vehicle + " in sky");
}
public void runRoad(String vehicle){
System.out.println(vehicle + " in road");
}
public void runSea(String vehicle){
System.out.println(vehicle + " in Sea");
}
}
运行结果:
/*
car in road
fish in Sea
plane in sky
*/
分析方式三
- 这种修改方法没有对原来的类做大的修改,只是增加方法
- 这里虽然没有在类这一级别上遵守单一职责原则,但是在方法上仍然是遵守单一职责原则