Java进阶 | 从整体上观察面向对象
一、面向對象
面向對象是Java編程中最核心的思想,基本特征:繼承、封裝、多態(tài)。
1、特征之封裝
將結構、數(shù)據(jù)、操作封裝在對象實體中,使用時可以不關注對象內(nèi)部結構,只能訪問開放權限的功能入口,從而降低程序耦合程度,提供安全性和可持續(xù)維護性。
public class Concept01 {public static void main(String[] args) {Student student = new Student("張三","高三",29f);student.conclusion();} } class Student {private String name ;private String grade ;private Float score ;public Student(String name, String grade, Float score) {this.name = name;this.grade = grade;this.score = score;}public void conclusion (){System.out.println("姓名:"+this.getName());System.out.println("年級:"+this.getGrade());System.out.println("分數(shù):"+this.getGrade());if (this.getScore() >= 100.0f){System.out.println("評語:本學期優(yōu)等生");} else {System.out.println("評語:本學期潛力股");}} }案例描述Student的學期總結,通過構造方法構建具體的學生對象,并且只通過conclusion方法獲取學生學期評價。
2、特征之繼承
子類除了提供自身的能力之外,還可以通過繼承的方式獲取父類開放的屬性和方法,以增強自身的功能。
public class Concept02 {public static void main(String[] args) {// 判斷 Digital 是 Phone 父類System.out.println(Digital.class.isAssignableFrom(Phone.class));} } class Digital {} class Phone extends Digital{}這里通過isAssignableFrom方法判斷Digital是Phone父類。
3、特征之多態(tài)
不同主體類對同一個動作給出不同的實現(xiàn)方式,多態(tài)也是Java描述設計模式的常用手段,最直接的作用就是程序解耦。
public class Concept03 {public static void main(String[] args) {Animal animalDog = new Dog();Animal animalCat = new Cat();animalDog.voice();animalCat.voice();} } class Animal {public void voice () {System.out.println("Animal ... voice");} } class Dog extends Animal {@Overridepublic void voice() {System.out.println("Dog ... Wang wang");} } class Cat extends Animal {@Overridepublic void voice() {System.out.println("Cat ... Meow meow");} }通常動物都有發(fā)出聲音的能力,但是不同動物聲音不同,這里基于多態(tài)實現(xiàn),不同動物的聲音特征。
二、關系圖譜
在了解面向對象之后,還需要理解一下基礎的關系模型,在實際的業(yè)務中都是基于這些基礎的關系解決場景問題。
1、繼承與實現(xiàn)
繼承關系:強調(diào)屬性和方法從父類向子類的傳承。實現(xiàn)關系:強調(diào)描述抽象和具體實現(xiàn)的邏輯。
/*** 繼承*/ class classA {} class classB extends classA {} interface interfaceA {} interface interfaceB extends interfaceA {} /*** 實現(xiàn)*/ class classC implements interfaceA,interfaceB{}2、依賴與關聯(lián)
依賴關系:常用來描述方法局部變量或者入?yún)?#xff0c;即類的方法中調(diào)用了另一個類。關聯(lián)關系:類的成員變量是另一個類,比如常見的一對一,一對多關系。
/*** 依賴*/ class RelyA {} class RelyB {public void depend (RelyA rely){} } /*** 關聯(lián)*/ class AssociateA {} class AssociateB {private AssociateA associateA ; }3、組合與聚合
聚合關系:描述整體與部分的關系,但是部分不需要依賴整體存在。組合關系:描述整體與部分的關系,但是部分需要依賴整體存在。
/*** 聚合*/ class ElementA {} class ElementB {} class Aggregation {private ElementA elementA ;private ElementB elementB ; } /*** 組合*/ class PortionA{} class PortionB{} class Composition {private PortionA portionA ;private PortionB portionB ; }三、模式與原則
在面對復雜業(yè)務時,可以時常參考設計模式和基本原則,以此設計合理的業(yè)務結構,實現(xiàn)代碼的高內(nèi)聚低耦合,但是在一些特定場景下,也要果斷的突破這些模板或原則,可以更好的支撐業(yè)務。
1、設計模式
創(chuàng)建模式
抽象對象實例化的創(chuàng)建過程,對不同類型的對象提供高效的管理方式與合理的創(chuàng)建手段。
- 單例模式
- 原型模式
- 工廠模式
- 建造者模式
結構模式
設計類的組裝模式,合理的對象結構,有利于支持業(yè)務的持續(xù)迭代,結構會直接影響代碼的可持續(xù)維護性。
- 代理模式
- 外觀模式
- 適配器模式
- 裝飾者模式
- 組合模式
- 享元模式
- 橋梁模式
行為模式
行為模式涉及對象職責定義,通信協(xié)作,和最具體的業(yè)務邏輯實現(xiàn),明確程序運行時的流程軌跡。
可以基于繼承或實現(xiàn)的方式控制不同類的行為職責,即頂層抽象控制行為,下層逐級做具體邏輯實現(xiàn);或者直接聚合管理責任對象,做統(tǒng)一分配。
- 觀察者模式
- 模版方法模式
- 策略模式
- 命令模式
- 調(diào)停者模式
- 備忘錄模式
- 解釋器模式
- 迭代器模式
- 狀態(tài)模式
- 責任鏈模式
- 訪問者模式
2、基本原則
-
開閉原則:在做代碼結構設計時,應該考慮對擴展開放,對修改關閉,抽象思維搭建結構,具體實現(xiàn)擴展細節(jié)。
-
單一職責:一個類應該只負責一項職責;減少代碼一處變更引起的程序大規(guī)模改動情況,降低類的復雜度;
-
接口隔離:每一個接口應該是一種角色;盡量避免具體實現(xiàn)類中用不到但是又必須實現(xiàn)的方法;
-
依賴倒轉:上層模塊不應該依賴下層模塊,抽象邏輯不應該依賴具體細節(jié),即中心思想是面向接口編程。
-
里氏替換:繼承時遵循里氏替換原則,子類中盡量不要重寫父類的方法,可以擴展父類的功能;
-
迪米特原則:最少知道原則即類對象對其依賴的類知道的越少越好,以此降低耦合程度;
-
組合/聚合復用:新對象應使用部分已有的對象,使其成為新對象組成部分,實現(xiàn)已有功能的復用,以此降低單個類的復雜程度。
四、業(yè)務應用
在業(yè)務開發(fā)中,很多復雜的邏輯都是基于面向對象的思想做的設計和具體實現(xiàn),但是在實際上業(yè)務是不斷變化的,所以不管是常用的Mvc模式,或者領域設計,只要經(jīng)過多個版本迭代,多人參與的開發(fā),到最后代碼在邏輯層面都會讓人著迷。
也就是常說的一種現(xiàn)象:新人重構,老人不斷修復問題,然而鐵打的問題,流水的開發(fā),但凡經(jīng)歷過重構的同學都知道,所謂的大規(guī)模重構很難徹底解決問題,甚至這是個循環(huán)動作。所以業(yè)務代碼更多是在那個版本周期內(nèi)是合理的,站在一個開發(fā)的角度,這里也可以理解為筆者個人角度,通常從下面幾個角度去思考具體的業(yè)務開發(fā):
- 規(guī)范約束
這是個人認為業(yè)務工程中最重要的基礎,不管業(yè)務如何復雜,都離不開與之相應的數(shù)據(jù)增刪改查,所以對常規(guī)基礎操作做好統(tǒng)一代碼風格管理,這樣有助于別人快速理解整體結構和邏輯。
這里風格指:接口命名,參數(shù),組件,中間件等統(tǒng)一,以持久層為例,避免多個組件混用的情況,如果是周期相對較長的項目,經(jīng)常看到單是分頁查詢的實現(xiàn)邏輯都有多種情況。
- 可復用性
易變是業(yè)務本身的特點,所以高度復用的業(yè)務代碼本身就存在很大的限制,例如常見的很多方法,為了適配各種場景,不斷擴展入?yún)?#xff0c;然后有些特殊業(yè)務也會進行特殊傳參。
還有一些開發(fā)常說的,能用一個接口實現(xiàn),絕對不使用兩個接口,看似很有個性,實際已經(jīng)走在挖坑的路上,多個功能請求同一個接口,即意味著任何接口的改動都要考慮很多邏輯的適配。
所以從上層向下看,不必過度考慮復用,從下向上看,底層的改動相對較少,應該考慮復用。
- 業(yè)務分層
從項目生命周期的角度思考,業(yè)務是一個迭代的過程,不需要過度前衛(wèi)的設計,項目的生命周期是多久沒人知道,最穩(wěn)妥的做法是快速迭代,產(chǎn)品和技術工程能快速穩(wěn)定的支撐業(yè)務發(fā)展即可。
經(jīng)典的業(yè)務分層管理是快速迭代的基本支撐,例如常用的Mvc模式,在復雜的業(yè)務場景下可以再次細化管理,或者向領域設計靠近。
- 流程分段
業(yè)務可以理解為流程管理,小的流程通常service中可以直接處理,但是復雜流程則十分講究設計,一個基礎思想就是分段管理,比較經(jīng)典的案例就是下單:構建結算頁面時初始化訂單-支付時訂單提交-支付成功才會執(zhí)行訂單。
- 細節(jié)問題
邏輯上的細節(jié)要持續(xù)追求嚴謹,業(yè)務實現(xiàn)手段和思路適當放寬,流程經(jīng)得起考驗,底層實現(xiàn)合理的復用,組件選擇上應該站在高緯度,就基本足以。
五、源代碼地址
GitHub·地址 https://github.com/cicadasmile/java-base-parent GitEE·地址 https://gitee.com/cicadasmile/java-base-parent閱讀標簽
【Java基礎】【設計模式】【結構與算法】【Linux系統(tǒng)】【數(shù)據(jù)庫】
【分布式架構】【微服務】【大數(shù)據(jù)組件】【SpringBoot進階】【Spring&Boot基礎】
【數(shù)據(jù)分析】【技術導圖】【 職場】
總結
以上是生活随笔為你收集整理的Java进阶 | 从整体上观察面向对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HD_1166敌兵布阵
- 下一篇: Java中类、方法声明为静态的含义