java 接口编程_JAVA面向接口编程
一、什么是面向接口編程
要正確地使用Java語言進(jìn)行面向?qū)ο蟮木幊?#xff0c;從而提高程序的復(fù)用性,增加程序的可維護(hù)性、可擴(kuò)展性,就必須是面向接口的編程。面向接口的編程就意味著:開發(fā)系統(tǒng)時,主體構(gòu)架使用接口,接口構(gòu)成系統(tǒng)的骨架。這樣就可以通過更換實(shí)現(xiàn)接口的類來更換系統(tǒng)的實(shí)現(xiàn)。
例如:在上節(jié)示例中,Java接口Introduceable就是系統(tǒng)骨架的一個重要組成部分,這個Java接口定義了一個方法:detailo中心類和教員類分別實(shí)現(xiàn)了Java接口Introduceable,因此具有了不同的detail方法實(shí)現(xiàn)。在School2類中,print方法接收的參數(shù)類型是Introduceable,這樣,就可以向print方法傳遞任意一個Introduceable接口的實(shí)現(xiàn)類,在運(yùn)行時,Java虛擬機(jī)會根據(jù)實(shí)際創(chuàng)建的對象類型調(diào)用不同的方法實(shí)現(xiàn)。這就意味著:可以通過更換實(shí)現(xiàn)接口的類來更換系統(tǒng)的實(shí)現(xiàn)。
二、面向接口編程的示例
接下來通過一個示例詳細(xì)講解面向接口編程的實(shí)現(xiàn)過程。
案例需求的效果圖如圖1所示。
升級系統(tǒng),要求如下:
★ 打印機(jī)有多種類型,比如:黑白打印機(jī)、彩色打印機(jī)等。
★ 中心可能配備其中任意一款打印機(jī),負(fù)責(zé)打印教員或者中心的詳細(xì)信息。
★ 系統(tǒng)要具備良好的可擴(kuò)展性與可維護(hù)性。
圖1 使用不同類型的打印機(jī)進(jìn)行打印
采用面向接口編程的方式實(shí)現(xiàn)可以分為3個步驟。
1.抽象出Java接口
分析:由于黑白、彩色打印機(jī)都存在一個共同的方法特征:print,而且黑白、彩色打印機(jī)對print方法有各自不同的實(shí)現(xiàn),因此可以抽象出一個Java接口PrinterFace(代表打印機(jī)),在其中定義print方法。
具體實(shí)現(xiàn)代碼如下:
折疊
Java 代碼
package?Java.sg.ch03;
publicinterfacePrinterFace?{
//定義打印方法
publicvoicl?print?(String?content);
}
2.實(shí)現(xiàn)Java接口
分析:在第一步中已經(jīng)抽象出Java接口PrinterFace,并在其中定義了print方法。由于黑白、彩色打印機(jī)對print方法有各自不同的實(shí)現(xiàn),因此在第2步中,要讓黑白、彩色打印機(jī)實(shí)現(xiàn)PrinterFace接口,各自實(shí)現(xiàn)print方法。
彩色打印機(jī)代碼實(shí)現(xiàn)如下:
折疊
Java 代碼
package?Java.sg.ch03;
publicclassColorPrinterimplements
PrinterFace?{
/**
*?打印方法
*/
publicvoidprint(String?content)?{
System.out.println("彩色打印?:");
System.out.println(content);
}
}
黑白打印機(jī)代碼實(shí)現(xiàn)如下:
折疊
Java 代碼
package?Java.sg.ch03;
publicclassBlackPrinterimplements
PrinterFace?{
/**
*?打印方法
*/
publicvoidprint(String?content)?{
System.out.println("黑白打印?:");
System.out.println(content);
}
}
3.使用Java接口
經(jīng)驗(yàn):現(xiàn)在,Java接口及其實(shí)現(xiàn)類都已經(jīng)創(chuàng)建完畢,接著,我們就要使用面向接口編程的原則,讓接口構(gòu)成系統(tǒng)的骨架,以便達(dá)到更換實(shí)現(xiàn)接口的類就可以更換系統(tǒng)的實(shí)現(xiàn)的目的。
中心類負(fù)責(zé)對外提供打印功能,要求可以隨時更換打印機(jī)類型。代碼實(shí)現(xiàn)如下:
折疊
Java 代碼
package?Java.sg.ch03;
publicclassSchool3implementsIntroduceable{
privatePrinterFace?printer;//打印機(jī)
//??輸出中心的詳細(xì)信息
publicString?detail()?{
return"這里是中心";
}
//??使用中心打印機(jī)打印信息
publicvoidprint(Introduceable?intro){
printer.print(intro.detail());
}
//設(shè)置打印機(jī)
publicvoidsetPrinter(PrinterFace?p)?{
this.printer?=?p;
}
}
測試類提供main方法進(jìn)行單元測試。代碼實(shí)現(xiàn)如下:
折疊
Java 代碼
/*
*?jsp.sg.ch04.Test.java
*?2011-5-29
*?4u^j2JavaJavaL
*/
packageJava.sg.ch03;
publicclassTest?{
publicstaticvoidmain(String[]?args)?{
//創(chuàng)建中心實(shí)例
School3?school?=newSchool3();
//為該中心配備黑白打印機(jī)
school.setPrinter(newBlackPrinter());
school.print(school);
//為該中心配備彩色打印機(jī)
school.setPrinter(newColorPrinter());
school.print(school);
}
}
經(jīng)驗(yàn):面向接口編程可以實(shí)現(xiàn)接口和實(shí)現(xiàn)的分離,這樣做的最大好處就是能夠在客戶端未知的情況下修改實(shí)現(xiàn)代碼。那么什么時候應(yīng)該抽象出Java接口呢?一種是用在層和層之問的調(diào)用。層和層之間是最忌諱耦合度過高或是改變過于頻繁。設(shè)計(jì)優(yōu)秀的接口能夠解決這個問題。另一種是用在那些不穩(wěn)定的部分上。如果某些需求的變化性很大,那么定義接口也是一種解決之道。設(shè)計(jì)良好的接口就像是我們?nèi)粘J褂玫娜f用插座一樣,不論插頭如何變化,都可以使用。
最后強(qiáng)調(diào)一點(diǎn),良好的接口定義一定是來自于需求的,它絕對不是程序員絞盡腦汁想出來的。
總結(jié)
以上是生活随笔為你收集整理的java 接口编程_JAVA面向接口编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux虚拟终端时间短,使用Scree
- 下一篇: opencv svm 多分类问题