Java 設計模式 Day3 之面向抽象原則:什么是面向抽象編程?面向抽象編程如何應用?

文章目錄

  • 前言
  • 一、什么是面向抽象編程?
  • 二、傳統場景的類設計
    • 2.1、項目場景設計
    • 2.2、傳統類設計存在的問題
  • 三、采用面向抽象編程的類設計
    • 3.1、設計一個抽象類/接口
    • 3.2、采用上轉型對象/接口回調調用子類方法
    • 3.3、重新設計子類/被實現類
    • 3.4、面向抽象編程的具體實現
  • 四、面向抽象編程的優勢
  • 總結


前言

面向抽象原則是面向對象四大基本原則的第一條,其重要性不言而喻,面向抽象原則分為抽象類、接口以及面向抽象編程,在之前的內容中我們詳細介紹了抽象類與接口,并對二者進行了對比,在本文中我們將詳細介紹什么是面向抽象編程,它與傳統編程相比有什么優勢?在開發中又該如何切實應用。

在這里插入圖片描述


一、什么是面向抽象編程?

面向抽象編程就是在設計一個類時,不讓該類面向具體的類,而是面向抽象類或接口,即所設計的類中的重要數據是抽象類或接口聲明的變量,而不是具體類聲明的變量

下面我們將在具體的案例中進一步分析傳統類設計與面向抽象編程的類設計的區別。

二、傳統場景的類設計

在探討面向抽象編程之前,先看一下我們常規對于一個類的設計是什么樣的。

2.1、項目場景設計

項目場景:現在我們需要求一個圓柱體的體積,需要創建兩個類,圓類 Circle 和圓柱體類 Pillar。

首先我們創建一個 Circle 類,該類創建的對象 circle 調用 getArea() 方法可以計算出圓的面積,Circle 類的代碼如下:

package com.bailu.principle;public class Circle {final double PI = 3.14159;// 定義一個常量double r;/** 定義一個無參構造*/Circle() {}Circle(double r) {this.r = r;}public double getArea() {return (PI * r * r);}
}

接著我們再設計一個圓柱類 Pillar,該類創建的對象 pillar 調用 getVolume() 方法可以計算圓柱體的體積,Pillar 類的代碼如下:

package com.bailu.principle;public class Pillar {Circle bottom;// 將Circle類聲明的對象作為成員,圓柱體的底double height;/** 定義一個無參構造*/Pillar() {}Pillar(Circle bottom, double height) {this.bottom = bottom;this.height = height;}public double getVolume() {return bottom.getArea() * height;}
}

2.2、傳統類設計存在的問題

在上面的圓柱體類 Pillar 中,bottom 是用具體類 Circle 聲明的變量,如果在實際開發中不涉及用戶需要的變化,這樣設計并沒有什么不妥,但是某些時候,如果用戶希望將圓柱體改為三菱柱。顯然 Pillar 類是無法滿足的,并不能滿足用戶的需求

那我們就需要對 Pillar 類進行修改。對于需要我們需要明確,柱體計算體積關鍵點在于計算底面積。我們不應該關心它的底具體是什么樣的形狀,而應該關心是否有計算面積的方法。

即我們在設計類的時候不應該將柱體的底看做某個具體類聲明的變量,我們上面這樣做,Pillar 類太過于依賴具體類,缺乏彈性,難以應對需求的變化

三、采用面向抽象編程的類設計

3.1、設計一個抽象類/接口

如果我們采用面向抽象編程重新進行設計,首先需要設計一個抽象類用來獲取柱體底面積,該抽象類(或接口)我們定義為 Geometry(),我們在其中定義一個 getArea() 的抽象方法,具體代碼如下:

package com.bailu.principle;public abstract class Geometry {// 如果使用的是接口,用interface定義即可public abstract double getArea();
}

現在我們就可以面向 Geometry 類進行編碼,即通過上轉型對象/接口回調的方式,調用 Geometry 子類重寫的 getArea() 方法,這樣 Pillar 類就可以將計算柱體底面積的任務指派給 Geometry 子類的實例

3.2、采用上轉型對象/接口回調調用子類方法

現在我們重新設計 Pillar 類不再依賴具體類,而是面向我們創建的抽象類/接口 Geometry,即 bottom 不再是具體類 Circle 聲明的變量,重新設計后 Pillar 類代碼如下:

package com.bailu.principle;public class Pillar {Geometry bottom;// bottom是抽象類Geometry聲明的變量double height;/** 定義一個無參構造*/Pillar() {}Pillar(Geometry bottom, double height) {this.bottom = bottom;this.height = height;}public double getVolume() {return bottom.getArea() * height;// bottom可以調用子類重寫的getArea()方法}
}

3.3、重新設計子類/被實現類

在采用面向抽象編程之后,我們就可以根據客戶需求對柱體要求的不同底進行設計。如圓形底和矩形底,我們創建抽象類 Geometry 的子類 Circle 和 Rectangle,重寫 Geometry 類的抽象方法 getArea()計算各自面積。

Circle 類對應代碼如下:

package com.bailu.principle;/** 當柱體的底為圓時*/
public class Circle extends Geometry {final double PI = 3.14159;// 定義一個常量double r;/** 定義一個無參構造*/Circle() {}Circle(double r) {this.r = r;}@Overridepublic double getArea() {return (PI * r * r);}
}

Rectangle 類對應代碼如下:

package com.bailu.principle;/** 當柱體的底為矩形時*/
public class Rectangle extends Geometry {double a, b;// 定義矩形的長寬/** 創建一個無參構造*/Rectangle() {}Rectangle(double a, double b) {this.a = a;this.b = b;}@Overridepublic double getArea() {return a * b;}
}

3.4、面向抽象編程的具體實現

現在我們就可以使用 Pillar 類創建出不同形狀底的柱體了,實現代碼如下:

package com.bailu.principle;public class ApplicationPillar {public static void main(String[] args) {Pillar pillar;Geometry bottom;bottom = new Rectangle(2, 3);// 抽象類的實例作為Rectangle類的上轉型對象pillar = new Pillar(bottom, 3);System.out.println("矩形底柱體體積為: " + pillar.getVolume());bottom = new Circle(2);// 抽象類的實例作為Circle類的上轉型對象pillar = new Pillar(bottom,2);System.out.println("圓底柱體體積為: " + pillar.getVolume());}
}

運行結果具體如下圖所示:

在這里插入圖片描述

四、面向抽象編程的優勢

通過上面的案例我們可以發現,采用面向編程來設計 Pillar 類,使得 Pillar 類不再依賴于具體的某個類(Circle 類、Rectangle 類),當我們有新的需求增加時,我們只需要增加 Geometry 的子類即可,如增加一個三角形底的子類 Triangle,并不需要修改 Pillar 類的任何代碼就可以創建出三角形底的柱體


總結

在本文給大家介紹了什么是面向抽象編程,并通過與傳統類設計的對比使大家明確面向抽象編程的優勢,設計一個類時,不讓該類面向具體的類,而是面向抽象類或接口,即所設計的類中的重要數據是抽象類或接口聲明的變量,而不是具體類聲明的變量,這樣就算需求發生變化,我們只需要增加或修改抽象類子類內容即可,而無需修改其他代碼。

在這里插入圖片描述


我是白鹿,一個不懈奮斗的程序猿。望本文能對你有所裨益,歡迎大家的一鍵三連!若有其他問題、建議或者補充可以留言在文章下方,感謝大家的支持!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530667.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530667.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530667.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

贏在 CSDN:我在 CSDN 的成長,“長風破浪會有時”,如何保證自己有持續寫作的動力?

文章目錄前言一、如何結緣 CSDN?1.1、我的“黑客之路”初探1.2、CSDN 一眼看得到的優勢是什么?1.3、大學再遇 CSDN二、為什么開始在 C 站輸出內容?2.1、“好記性不如爛筆頭”2.2、記事本到“鼓勵工具”三、C 站吸引我的地方是什么?3.1、海量…

華為工業云平臺:制造業企業數據平臺建設最佳實踐分享

文章目錄前言一、制造行業數字化轉型和發展趨勢1.1、制造行業數字化轉型發展趨勢1.2、制造行業數字化轉型遇到的挑戰1.3、政策牽引,加快數字化轉型升級二、數字化轉型-業務角度2.1、智能生產2.2、智能銷售2.3、智能物流2.4、智能供應鏈2.5、智慧決策三、數字化轉型-…

計算機本科畢業設計:畢業設計、論文要點及我們面對畢業答辯應持有的態度

文章目錄前言一、對于畢業設計1.1、選題1.2、中期自查1.3、畢業設計答辯二、對于畢業論文三、我們應持有的態度3.1、人盡其才3.2、恪盡職守3.3、全力以赴3.4、做好自己總結前言 最近不斷有很多學弟、學妹來找我咨詢一些關于畢設、論文答辯的問題,一看日歷四月份了&a…

Eclipse 答疑:Eclipse 使用 Amateras UML 創建類圖點擊 Finish 沒反應解決方式匯總

文章目錄前言一、問題產生場景1.1、Amateras UML 創建類圖沒反應二、問題原因分析三、問題定位及解決3.1、定位檢查版本支持信息3.2、問題確認過程3.3、解決方式驗證四、不想降低版本怎么辦?總結前言 之前項目中在 Eclipse 使用 Amateras UML 創建類圖點擊 Finish 沒…

DDoS 攻擊與防護(二):DDoS 防護購買和使用入門指南,DDoS 防護服務有哪些應用場景?

文章目錄前言一、如何選擇 DDoS 高防和 DDoS 原生高級防護?二、如何購買和使用 DDoS 高防?2.1、購買 DDoS 高防2.2、DDoS 高防域名網站類業務接入流程2.3、配置防護域名2.4、上傳證書2.5、選擇實例和線路2.6、本地驗證2.7、修改 DNS 解析2.8、放行高防回…

Java 大廠面試必刷題 Day1:何為面向對象編程的思想?面向對象三大特征是什么?

文章目錄 前言一、何為面向對象編程的思想?二、面向對象的三大特征2.1、封裝關系2.2、繼承關系2.3、多態關系總結前言 從本文我們將開始《Java 大廠面試必刷題》系列的更新,Java 面試必刷題 Day1:何為面向對象編程的思想?面向對象三大特征是什么?這道題對于 Java 從業者來…

猿創征文|2022 互聯網從業心得:“但愿人長久,千里共嬋娟”,中秋先學會與自己內心團圓

文章目錄前言一、“好雨知時節,當春乃發生”1.1、《性格修正:如何突破你的原生性格》1.2、“疼我孰知父母”1.3、“海內存知己,天涯若比鄰”二、“讀萬卷書,行萬里路”2.1、“讀萬卷書”2.2、“行萬里路”三、“身體是革命的本錢”…

猿創征文|彈性云服務器 ECS:輕松上云第一步,如何根據應用場景購買和使用入門 ECS?

文章目錄前言一、什么是彈性云服務器?1.1、ECS 介紹1.2、為什么選擇 ECS?1.3、ECS 產品架構1.4、ECS 產品優勢二、彈性云服務器的實例類型三、彈性云服務器的購買3.1、基礎配置3.1.1、計費模式3.1.2、區域3.1.3、可用區3.1.4、CPU 架構3.1.5、規格3.1.6、…

猿創征文|不會代碼也能玩開發?基于華為云 IoT 快速實現 0 代碼體驗物聯網設備上云

文章目錄前言一、物聯網設備上云背景介紹二、實驗環境準備三、智慧煙感器上云體驗3.1、選擇向導式極速體驗3.2、對智慧煙感器進行產品定義3.3、定義目標設備標識碼、注冊設備3.4、根據需要選擇設備演示包3.5、下載、解壓設備演示包3.6、執行 bat 文件,運行設備演示包…

猿創征文|基于 AppCube 應用魔方:零代碼手把手教你 5 分鐘開發微信小程序

文章目錄前言一、AppCube 應用魔方1.1、什么是 AppCube 應用魔方?1.2、為什么選擇AppCube 應用魔方?二、項目實驗環境與資源準備2.1、實驗需求及環境介紹2.2、初次訂購 AppCube2.3、曾訂購過 AppCube三、進入 AppCube 全新零代碼界面四、配置業務用戶信息…

《軟件質量保證與測試》第 6 章——系統測試 重點部分總結

文章目錄 前言一、判斷題二、簡答題總結前言 軟件質量保證是建立一套有計劃,有系統的方法,來向管理層保證擬定出的標準、步驟、實踐和方法能夠正確地被所有項目所采用。軟件測試是使用人工或自動的手段來運行或測定某個軟件系統的過程,其目的在于檢驗它是否滿足規定的需求或…

《軟件質量保證與測試》第 9 章——測試自動化及其框架 重點部分總結

文章目錄 前言一、判斷題二、簡答題總結前言 軟件質量保證是建立一套有計劃,有系統的方法,來向管理層保證擬定出的標準、步驟、實踐和方法能夠正確地被所有項目所采用。軟件測試是使用人工或自動的手段來運行或測定某個軟件系統的過程,其目的在于檢驗它是否滿足規定的需求或…

一個長方體玻璃容器從里面量長寬_養觀賞魚用玻璃魚缸嗎?3種常見養魚容器,另外2種養魚效果不差...

養魚需要容器,不過我們常見的容器主要還是玻璃缸,長方形的玻璃缸。不過其實從玻璃缸這方面繼續延伸下去,還有一些熱彎,負壓,異形等等的魚缸款式,這樣說起來就比較多了。不過養魚的容器是僅僅限于玻璃類容器…

java中間件是什么意思_數據庫中間件漫談

1.前言隨著業務的發展,MySQL數據庫中的表會越來越多,表中的數據量也會越來越大,相應地,數據操作的開銷也會越來越大;另外,無論怎樣升級硬件資源,單臺服務器的資源(CPU、磁盤、內存、…

kafka多個消費者消費一個topic_kafka:一文讀懂消費者背后的那點quot;貓膩quot;

來自:z小趙前言經過前幾篇文章的介紹,大致了解了生產者背后的運行原理。消息有生產就得有人去消費,今天我們就來介紹下消費端消費消息背后發生的那點事兒。文章概覽消費者與消費組的“父子關系”。Repartition 觸發時機。消費者與 ZK 的關系。…

MySQL 入門教程:初學者一學就會,零基礎 MySQL 安裝及增刪改查入門

文章目錄前言一、MySQL 的相關概念介紹二、Windows 下 MySQL 的配置2.1、MySQL 安裝配置步驟2.2、MySQL 服務的啟動、停止與卸載三、MySQL 腳本的基本組成四、MySQL 中的數據類型4.1、數字類型4.2、日期和時間4.3、字符串類型五、使用 MySQL 數據庫5.1、登錄到 MySQL5.2、創建一…

四大基本反應類型的關系_如何進入四大的咨詢部門?

在會計行業,人人夢寐以求的職位,莫過于四大的財務咨詢的崗位,第一咨詢工作很高大上,第二沒有其他職位那么幸苦,我從我的工作經歷來講講,我是怎么進入咨詢這個“真香”崗位的。首先,給大家說一個…

MySQL 異常:這一篇就夠了,MySQL 拋出異常的幾種常見解決方式小結

Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database! 幾種解決方式小結 文章目錄Could not open JDBC Connection for transaction; nested exception is java.sql…

vnc用戶名 查看linux_vnc用戶名未被識別,5步教你如何解決vnc用戶名未被識別

在進行vnc使用時,很多小伙伴會出現用戶名未被識別的情況,那如何解決vnc用戶名未被識別呢?咱接著往下看。使用工具:IIS7服務器管理工具主程序界面圖:官網地址:IIS7服務器管理工具作為IIS7服務器管理工具&…

IntelliJ IDEA 亂碼:全網最全 4 種方法完美解決 IntelliJ IDEA 控制臺中文亂碼問題

文章目錄前言一、修改當前 Web 項目 Tomcat Server 的虛擬機輸出選項二、修改 IntelliJ IDEA 全局編碼、項目編碼、屬性文件編碼三、IntelliJ IDEA 中自定義虛擬機選項四、直接修改 IntelliJ IDEA 配置文件的編碼信息五、修改成功亂碼問題解決總結前言 IntelliJ IDEA 如果不進行…