設計模式-七大設計原則-單一職責原則
阿新 • • 發佈:2021-06-30
一、單一職責原則介紹
二、單一職責原則引入
1.方式一(違反了單一職責原則)
解析:摩托車、汽車是公路上執行的,但飛機並不是在公路上執行的。
public class SingleResponsibility1 { public static void main(String[] args) { // TODO Auto-generated method stub Vehicle vehicle = new Vehicle(); vehicle.run("摩托車"); vehicle.run("汽車"); vehicle.run("飛機"); } } // 交通工具類 // 方式1 // 1. 在方式1 的run方法中,違反了單一職責原則 // 2. 解決的方案非常的簡單,根據交通工具執行方法不同,分解成不同類即可 class Vehicle { public void run(String vehicle) { System.out.println(vehicle + " 在公路上執行...."); } }
2.方式二(類級別遵守了單一職責原則,但是改動會很大)
解析:如果需要再實現一個不同交通方式,比如"宇宙飛船天空執行",那麼就需要新增一個"宇宙飛船類"及"run方法",最後客戶端要new一個宇宙飛船物件才能呼叫新的"run方法"。
public class SingleResponsibility2 { public static void main(String[] args) { // TODO Auto-generated method stub RoadVehicle roadVehicle = new RoadVehicle(); roadVehicle.run("摩托車"); roadVehicle.run("汽車"); AirVehicle airVehicle = new AirVehicle(); airVehicle.run("飛機"); } } //方案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 + "水中執行"); } }
3.方式三(類級別沒有遵守單一職責原則,但是方法級別上遵守了,推薦)
解析:這裡如果需要新增"宇宙飛船天空執行"這個交通方式,只需要在類中新增對應的方法即可,客戶端直接呼叫"新的run方法"。
public class SingleResponsibility3 { public static void main(String[] args) { // TODO Auto-generated method stub Vehicle2 vehicle2 = new Vehicle2(); vehicle2.run("汽車"); vehicle2.runWater("輪船"); vehicle2.runAir("飛機"); } } //方式3的分析 //1. 這種修改方法沒有對原來的類做大的修改,只是增加方法 //2. 這裡雖然沒有在類這個級別上遵守單一職責原則,但是在方法級別上,仍然是遵守單一職責 class Vehicle2 { public void run(String vehicle) { //處理 System.out.println(vehicle + " 在公路上執行...."); } public void runAir(String vehicle) { System.out.println(vehicle + " 在天空上執行...."); } public void runWater(String vehicle) { System.out.println(vehicle + " 在水中行...."); } //方法2. //.. //.. //... }