對類來講,即一個類應用只負責一項職責,如類A負責兩個不一樣的職責:職責1,職責2.當職責1需求變動時,可形成職責2執行錯誤,因此須要將類A的粒度分解爲A1,A2.java
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 + "在水裏跑"); } }