對類來說,即一個類應用只負責一項職責,如類A負責兩個不同的職責:職責1,職責2.當職責1需求變更時,可造成職責2執行錯誤,所以需要將類A的粒度分解為A1,A2.
- 降低類的復雜度,一個類只負責一項職責
- 提高類的可讀性,可維護性
- 降低變更引起的風險
- 通常情況下,我們應該遵守單一職責原則,只在邏輯足夠簡單,才可以在代碼級別違反單一職責原則;只有類中方法數量足夠少時,可以在方法級別保持單一職責原則即可
package www.perwrj.principle.SRP;
/**
* 方案一:不遵守單一職責原則
* @author wangruijie
*
*/
public class SingleResponsibilityDemo1 {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.run("汽車");
vehicle.run("飛機");
vehicle.run("潛艇");
/*
* 汽車在跑
飛機在跑
潛艇在跑
*/
}
}
/**
* 交通工具類
* @author wangruijie
*
*/
class Vehicle{
/**
* run方法中,違反單一職責原則
* 解決方案很簡單,根據交通工具運行的方式不同,分解成不同的類即可
* @param vegicle
*/
public void run(String vegicle) {
System.out.println(vegicle + "在跑");
}
}
package www.perwrj.principle.SRP;
/**
* 方案二:遵守了單一職責原則
* 但這樣花銷很大,要將類分解,同時修改客戶端
* 改進:直接修改Vehicle類
* @author wangruijie
*
*/
public class SingleResponsibilityDemo2 {
public static void main(String[] args) {
RoadVehicle roadVehicle = new RoadVehicle();
roadVehicle.run("汽車");
AirVehicle airVehicle = new AirVehicle();
airVehicle.run("飛機");
WaterVehicle waterVehicle = new WaterVehicle();
waterVehicle.run("潛艇");
}
}
/**
* 地上跑的
* @author wangruijie
*
*/
class RoadVehicle{
public void run(String vehicle) {
// TODO Auto-generated method stub
System.out.println(vehicle + "地上跑的");
}
}
/**
* 天上飛的
* @author wangruijie
*
*/
class AirVehicle{
public void run(String vehicle) {
// TODO Auto-generated method stub
System.out.println(vehicle + "天上飛的");
}
}
/**
* 在水中跑
* @author wangruijie
*
*/
class WaterVehicle{
public void run(String vehicle) {
// TODO Auto-generated method stub
System.out.println(vehicle + "在水中跑");
}
}
package www.perwrj.principle.SRP;
/**
* 方案三
* 這種修改方法沒有對原來類做大的修改,只是增加了方法,
* 沒有在類級別上遵守單一職責原則
* 在方法級別上遵守單一職責原則
* @author wangruijie
*
*/
public class SingleResponsibilityDemo3 {
public static void main(String[] args) {
Vehicle2 vehicle2 = new Vehicle2();
vehicle2.run("汽車");
vehicle2.runAir("飛機");
vehicle2.runWater("潛艇");
}
}
/**
* 交通工具類
* @author wangruijie
*
*/
class Vehicle2{
/**
*
* @param vegicle
*/
public void run(String vegicle) {
System.out.println(vegicle + "在地上跑");
}
public void runAir(String vegicle) {
System.out.println(vegicle + "在天上跑");
}
public void runWater(String vegicle) {
System.out.println(vegicle + "在水里跑");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/264065.html
標籤:Java
上一篇:SpringBoot整合MyBatis-Plus框架(代碼生成器)
下一篇:后期靜態系結在PHP中的使用
