圖解Java設計模式之設計模式七大原則 2.1 設計模式的目的 2.2 設計模式七大原則 2.3 單一職責原則 2.3.1 基本介紹 2.3.2 應用實例 2.4 介面隔離原則(Interface Segregation Principle) 2.4.1 基本介紹 2.4.2 應用實例 2.5 依賴 ...
圖解Java設計模式之設計模式七大原則
2.1 設計模式的目的
編寫軟體過程中,程式員面臨著來自耦合性,內聚性以及可維護性,可擴展性,重用性,靈活性等多方面的挑戰,設計模式是為了讓程式(軟體)。具有更好
1)代碼重用性(即:相同功能的代碼,不用多次編寫)
2)可讀性(即:編程規範性,便於其他程式員的閱讀和理解)
3)可擴展性(即:當需要增加新的功能時,非常的方便,稱為可維護)
4)可靠性(即:當我們增加新的功能後,對原來的功能沒有影響)
5)使程式呈現高內聚,低耦合的特性
6)設計模式包含了面向對象的精髓,“懂了設計模式,你就懂了面向對象分析和設計(OOA/D)的精要“
7)Scott Mayers 在其巨著《Effective C++》就曾經說過 :C++老手和C++新手的區別就是前者手背上有很多傷疤
2.2 設計模式七大原則
設計模式原則,其實就是程式員在編程時,應當遵守的原則,也是各種設計模式的基礎(即:設計模式為什麼這樣設計的依據)
設計模式常用的七大原則有 :
1)單一職責原則
2)介面隔離原則
3)依賴倒轉(倒置)原則
4)里氏替換原則
5)開閉原則
6)迪米特法則
7)合成復用原則
2.3 單一職責原則
2.3.1 基本介紹
對類來說的,即一個類應該只負責一項職責。如類A負責兩個不同職責 :職責1,職責2。當職責1需求變更而改變A時,可能造成職責2執行錯誤,所以需要將類A的粒度分解為A1,A2
2.3.2 應用實例
以交通工具案例講解
package com.example.testdemo.mode.principle;
public class SingleResponsibility1 {
public static void main(String[] args) {
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 + " 在公路上運行。。。。。");
}
}
package com.example.testdemo.mode.principle;
public class SingleResponsibility2 {
public static void main(String[] args) {
ReadVehicle readVehicle = new ReadVehicle();
readVehicle.run("摩托車");
readVehicle.run("汽車");
AirVehicle airVehicle = new AirVehicle();
airVehicle.run("飛機");
WaterVehicle waterVehicle = new WaterVehicle();
waterVehicle.run("輪船");
}
}
/**
* 方案2分析 :
* 1 :遵守單一職責原則
* 2 :但是這樣改動大,即將類分解,同時修改客戶端
* 3 :改進 :直接修改Vehicle類,改動的代碼會比較少 =》方案3
*
*/
class ReadVehicle {
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 + "水中運行");
}
}
package com.example.testdemo.mode.principle;
public class SingleResponsibility3 {
public static void main(String[] args) {
Vehicle2 vehicle2 = new Vehicle2();
vehicle2.run("汽車");
vehicle2.runAir("飛機");
vehicle2.runWater("輪船");
}
}
/**
* 方案3的分析 :
* 1 :這種修改方法沒有對原來的類做大的修改,只是增加方法
* 2 :這裡雖然沒有在類這個級別上遵守單一職責原則,但是在方法級別上,仍然是遵守單一職責
*/
class Vehicle2 {
public void run(String vehicle) {
System.out.println(vehicle +