圖解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 依賴倒轉原則
- 2.5.1 基本介紹
- 2.5.2 應用實體
- 2.6 里氏替換原則
- 2.6.1 OO中的繼承性的思考和說明
- 2.6.2 基本介紹
- 2.6.3 一個程式引出的問題和思考
- 2.6.4 解決方法
- 2.7 開閉原則
- 2.7.1 基本介紹
- 2.7.2 看下面一段代碼
- 2.7.3 方式1的優缺點
- 2.7.4 改進的思路分析
- 2.8 迪米特法則
- 2.8.1 基本介紹
- 2.8.2 應用實體
- 2.8.3 應用實體改進
- 2.8.4 迪米特法則注意事項和細節
- 2.9 合成復用原則(Composite Reuse Principle)
- 設計原則核心思想
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 + " 在公路上運行,,,,,");
