您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java單一職責原則怎么實現”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java單一職責原則怎么實現”吧!
首先我們可以對某個類來說,即一個類應該只負責一項職責。如類A負責兩個不同職責: 職責1,職責2。當職責1需求變更而改變A時,可能造成職責2執行錯誤,所以需要將類A的粒度分解為A1,A2。
我們來看下面這段代碼:????????????
package com.szh.principle.singleresponsibility; /** * 交通工具類 * 方式1 * 1. 在方式1的run方法中,違反了單一職責原則 * 2. 解決的方案非常的簡單,根據交通工具運行方法不同,分解成不同類即可 */ class Vehicle { public void run(String vehicle) { System.out.println(vehicle + " 在公路上運行...."); } } public class SingleResponsibility1 { public static void main(String[] args) { Vehicle vehicle = new Vehicle(); vehicle.run("摩托車"); vehicle.run("汽車"); vehicle.run("飛機"); vehicle.run("輪船"); } }
乍一看沒什么問題吧,但是我們運行之后,看到的結果似乎就不太合乎思維邏輯了。摩托車、汽車在公路上運行肯定沒問題,但是飛機和輪船呢???(你是故意找茬是不是?)
對于上面代碼案例中的問題,想必大家也都看出來了,Vehicle這個類負責的職責太多了,它既要管摩托車、汽車這種在公路上跑的,還要去管飛機這種在天上飛的,這就使得Vehicle這個類粒度太粗了,后期如果做出對公路方法的修改時,可能還會影響到其他的業務功能。
所以我們考慮將Vehicle這個類進行分解,分解為多個類,各干各的、各司其職。
package com.szh.principle.singleresponsibility; /** * 方案2的分析 * 1. 遵守單一職責原則 * 2. 但是這樣做的改動很大,即將類分解,同時修改客戶端 * 3. 改進:直接修改Vehicle 類,改動的代碼會比較少=>方案3 */ 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 + "在水中運行"); } } public class SingleResponsibility2 { public static void main(String[] args) { RoadVehicle roadVehicle = new RoadVehicle(); roadVehicle.run("摩托車"); roadVehicle.run("汽車"); AirVehicle airVehicle = new AirVehicle(); airVehicle.run("飛機"); WaterVehicle waterVehicle = new WaterVehicle(); waterVehicle.run("輪船"); } }
此時,我們將Vehicle拆解成了三個不同的類,再次運行。這樣看起來就正常了吧。
不過也有人說,這樣的改動比較大,也即直接在類的層面上做了修改,我們能不能不改動這個類,而是對它的方法做修改呢?答案是可以的。
package com.szh.principle.singleresponsibility; /** * 方式3的分析 * 1. 這種修改方法沒有對原來的類做大的修改,只是增加方法 * 2. 這里雖然沒有在類這個級別上遵守單一職責原則,但是在方法級別上,仍然是遵守單一職責 */ class Vehicle2 { public void runRoad(String vehicle) { System.out.println(vehicle + " 在公路上運行...."); } public void runAir(String vehicle) { System.out.println(vehicle + " 在天空上運行...."); } public void runWater(String vehicle) { System.out.println(vehicle + " 在水中行...."); } } public class SingleResponsibility3 { public static void main(String[] args) { Vehicle2 vehicle2 = new Vehicle2(); vehicle2.runRoad("汽車"); vehicle2.runAir("飛機"); vehicle2.runWater("輪船"); } }
此時我們并未將類進行拆解,而是將之前的run方法進行了拆解,雖然這樣的代碼沒有在類的層面上遵守單一職責原則,但是它卻在方法層面上遵守了單一職責原則,同樣可以做到正確的結果。
感謝各位的閱讀,以上就是“Java單一職責原則怎么實現”的內容了,經過本文的學習后,相信大家對Java單一職責原則怎么實現這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。