java 接口編程_JAVA面向接口編程

一、什么是面向接口編程

要正確地使用Java語言進行面向對象的編程,從而提高程序的復用性,增加程序的可維護性、可擴展性,就必須是面向接口的編程。面向接口的編程就意味著:開發系統時,主體構架使用接口,接口構成系統的骨架。這樣就可以通過更換實現接口的類來更換系統的實現。

例如:在上節示例中,Java接口Introduceable就是系統骨架的一個重要組成部分,這個Java接口定義了一個方法:detailo中心類和教員類分別實現了Java接口Introduceable,因此具有了不同的detail方法實現。在School2類中,print方法接收的參數類型是Introduceable,這樣,就可以向print方法傳遞任意一個Introduceable接口的實現類,在運行時,Java虛擬機會根據實際創建的對象類型調用不同的方法實現。這就意味著:可以通過更換實現接口的類來更換系統的實現。

二、面向接口編程的示例

接下來通過一個示例詳細講解面向接口編程的實現過程。

案例需求的效果圖如圖1所示。

升級系統,要求如下:

★ 打印機有多種類型,比如:黑白打印機、彩色打印機等。

★ 中心可能配備其中任意一款打印機,負責打印教員或者中心的詳細信息。

★ 系統要具備良好的可擴展性與可維護性。

1_110615195245_1.jpg

圖1 使用不同類型的打印機進行打印

采用面向接口編程的方式實現可以分為3個步驟。

1.抽象出Java接口

分析:由于黑白、彩色打印機都存在一個共同的方法特征:print,而且黑白、彩色打印機對print方法有各自不同的實現,因此可以抽象出一個Java接口PrinterFace(代表打印機),在其中定義print方法。

具體實現代碼如下:

折疊

Java 代碼

package?Java.sg.ch03;

publicinterfacePrinterFace?{

//定義打印方法

publicvoicl?print?(String?content);

}

2.實現Java接口

分析:在第一步中已經抽象出Java接口PrinterFace,并在其中定義了print方法。由于黑白、彩色打印機對print方法有各自不同的實現,因此在第2步中,要讓黑白、彩色打印機實現PrinterFace接口,各自實現print方法。

彩色打印機代碼實現如下:

折疊

Java 代碼

package?Java.sg.ch03;

publicclassColorPrinterimplements

PrinterFace?{

/**

*?打印方法

*/

publicvoidprint(String?content)?{

System.out.println("彩色打印?:");

System.out.println(content);

}

}

黑白打印機代碼實現如下:

折疊

Java 代碼

package?Java.sg.ch03;

publicclassBlackPrinterimplements

PrinterFace?{

/**

*?打印方法

*/

publicvoidprint(String?content)?{

System.out.println("黑白打印?:");

System.out.println(content);

}

}

3.使用Java接口

經驗:現在,Java接口及其實現類都已經創建完畢,接著,我們就要使用面向接口編程的原則,讓接口構成系統的骨架,以便達到更換實現接口的類就可以更換系統的實現的目的。

中心類負責對外提供打印功能,要求可以隨時更換打印機類型。代碼實現如下:

折疊

Java 代碼

package?Java.sg.ch03;

publicclassSchool3implementsIntroduceable{

privatePrinterFace?printer;//打印機

//??輸出中心的詳細信息

publicString?detail()?{

return"這里是中心";

}

//??使用中心打印機打印信息

publicvoidprint(Introduceable?intro){

printer.print(intro.detail());

}

//設置打印機

publicvoidsetPrinter(PrinterFace?p)?{

this.printer?=?p;

}

}

測試類提供main方法進行單元測試。代碼實現如下:

折疊

Java 代碼

/*

*?jsp.sg.ch04.Test.java

*?2011-5-29

*?4u^j2JavaJavaL

*/

packageJava.sg.ch03;

publicclassTest?{

publicstaticvoidmain(String[]?args)?{

//創建中心實例

School3?school?=newSchool3();

//為該中心配備黑白打印機

school.setPrinter(newBlackPrinter());

school.print(school);

//為該中心配備彩色打印機

school.setPrinter(newColorPrinter());

school.print(school);

}

}

經驗:面向接口編程可以實現接口和實現的分離,這樣做的最大好處就是能夠在客戶端未知的情況下修改實現代碼。那么什么時候應該抽象出Java接口呢?一種是用在層和層之問的調用。層和層之間是最忌諱耦合度過高或是改變過于頻繁。設計優秀的接口能夠解決這個問題。另一種是用在那些不穩定的部分上。如果某些需求的變化性很大,那么定義接口也是一種解決之道。設計良好的接口就像是我們日常使用的萬用插座一樣,不論插頭如何變化,都可以使用。

最后強調一點,良好的接口定義一定是來自于需求的,它絕對不是程序員絞盡腦汁想出來的。

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

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

相關文章

不僅僅是手機,MWC現全球首例 5G NR 商用部署

近日,MWC大會在在巴塞羅那舉行,5G折疊手機和5G部署進度成為這屆大會的重點。除了華為與三星發布的折疊手機外,本屆大會另一個值得關注的要點是三星和賽靈思宣布推進5G NR 商用部署在韓國落地,這應該是全球首例 5G 新無線電 (NR) 商…

小程序 顯示細線_精心設計:高密度顯示器上的細線

小程序 顯示細線Despite the many benefits of Retina displays, there is one clear drawback that must be considered when designing for high-density screens:盡管Retina顯示器具有許多優點,但在設計高密度屏幕時仍必須考慮一個明顯的缺點: 必須避…

React 入門手冊

大家好,我是若川。推薦這篇可收藏的React入門手冊。也推薦之前一篇類似的文章《如何使用 React 和 React Hooks 創建一個天氣應用》。點擊下方卡片關注我、加個星標React 是目前為止最受歡迎的 JavaScript 框架之一,而且我相信它也是目前最好用的開發工具…

函數04 - 零基礎入門學習C語言35

第七章:函數04 讓編程改變世界 Change the world by program 上節課的練習簡單講解,給力!! 1.自己實現pow()函數并嘗試驗證…… 2.猜想下sqrt()函數的原理并嘗試編程……(暫時只要求整型數據) 3.編寫一個用來統…

java數據結構與算法_清華大學出版社-圖書詳情-《數據結構與算法分析(Java版)》...

前 言數據結構是計算機程序設計重要的理論技術基礎,它不僅是計算機學科的核心課程,而且已經成為計算機相關專業必要的選修課。其要求是學會分析、研究計算機加工的數據結構的特性,初步掌握算法的時間和空間分析技術,并能夠編寫出結…

根號 巴比倫_建立巴比倫衛生設計系統

根號 巴比倫重點 (Top highlight)In this post I’ll explain the first phase of creating our Babylon DNA, the design system for Babylon Health, and how we moved the Babylon design team from Sketch to Figma.在這篇文章中,我將解釋創建巴比倫DNA的第一階…

《Migrating to Cloud-Native Application Architectures》學習筆記之Chapter 2. Changes Needed

2019獨角獸企業重金招聘Python工程師標準>>> Cultural Change 文化變革 A great deal of the changes necessary for enterprise IT shops to adopt cloud-native architectures will not be technical at all. They will be cultural and organizational changes t…

前端,你要知道的SEO知識

大家好,我是若川。三天假期總是那么短暫,明天就要上班了。今天推薦一篇相對簡單的文章。點擊下方卡片關注我、加個星標之前有同學在前端技術分享時提到了SEO,另一同學問我SEO是什么,我當時非常詫異,作為前端應該對SEO很…

編制網站首頁的基本原則

編制網站首頁的基本原則如下: 1、編制網站首頁的超文本文檔的組織結構應清晰,條理分明,重點突出,可讀性強,盡可能吸引用戶的注意力。 2、說明文字應簡明扼要,切中要害,每項內容介紹盡可能簡單明…

MySQL數據庫語句總結

增insert into -- 刪 delete from -- 改 update table名字 set -- 查 select * from -- 一.SQL定義 SQL(Structure Query Language)結構化查詢語言: (一)DDL(Data Definition Language&#…

高安全性同態加密算法_壞的同態性教程

高安全性同態加密算法I was going to write at length about the issues I see in neumorphism and why this trend should be avoided. I know any attempt to guide my most impressionable colleagues away from it, will end up being failing because this fad is going t…

前端容易忽略的 debugger 調試技巧

大家好,我是若川。我們日常開發碰到的很多問題,通過 debugger 都能快速定位問題,所以推薦這篇大家容易忽略的調試技巧。會定位問題,可以節省很多時間。也就是我經常說的工欲善其事,必先利其器。也是為什么我經常強調調…

Spring高級程序設計這本書怎么樣

關于Spring高級程序設計 評論讀后感:這本書需要有一定的spring基礎的人看讀后感:對于了解Spring 很有用,并且是一本不錯的參考書讀后感:這本書早就想買了,就是太貴了~~~ 啦啦啦&…

java調用arcgis rest服務器_c#調用arcgis地圖rest服務示例詳解(arcgis地圖輸出)

using System;using System.Collections.Generic;using System.Linq;using System.Text;using ESRI.ArcGIS.Client;using ESRI.ArcGIS.Client.Geometry;using ESRI.ArcGIS.Client.Tasks;using System.Net;using System.IO;namespace ArcGISDemo{//自定義的Featureclass Feature…

Semantic Element

Semantic Element 1.什么是語義化 根據內容的結構,選擇合適的標簽(代碼語義化)便于開發者閱讀。寫出更優雅的代碼的同時讓瀏覽器的爬蟲和機器很好地解析。 語義(semantic)  語義化標記,是指每種標記表示一…

玉伯:開源有帶給我什么

在2021年527螞蟻技術日上,螞蟻內源社區舉辦了內源專場,在專場上玉伯給大家分享了《開源有帶給我什么》,以下為演講的圖文整理。我的開源之路我從2009年到2018年,接近十年時間,一直在做開源的一些事情,在這個…

python并行運算庫_最佳并行繪圖Python庫簡介:“ HiPlot”

python并行運算庫HiPlot is Facebook’s Python library to support visualization of high-dimensional data table, released this January. It is particularly well known for its sophisticated interactive parallel plot.HiPlot是Facebook的Python庫,用于支持…

Asp.net 文件上傳的 FileUpload FileName 和 FileUpload PostedFile.FileName的細節問題

Asp.net 文件上傳的 FileUpload FileName 和 FileUpload PostedFile.FileName的細節問題 ASP.NET 文件上傳估計大家都用得很熟悉,常用控件 FileUpload 。 主要步驟: 1.判斷是否合法 2.獲得文件的路徑 (包括目錄的完整路徑,同時可能…

java 友元_C++ 友元函數 | 菜鳥教程

對教程中的例子,稍加修改,添加了友元類的使用。#include using namespace std;class Box{double width;public:friend void printWidth(Box box);friend class BigBox;void setWidth(double wid);};class BigBox{public :void Print(int width, Box &…

剛學編程的程序員必備這5大編程網站,你知道幾個?

一個好的網站,就是程序員學編程的基地。 雖說新手程序員也許知道一些在線編程網站,但是質量上乘的編程網站又知道幾個呢? 下面就來給大家推薦5個質量上乘的編程網站: 0、Leetcode LeetCode是大名鼎鼎的在線刷題網站,通過該網站的…