基礎(chǔ):
1.抽象類(lèi)和接口的區(qū)別
1.接口描述了方法的特征,不給出實(shí)現(xiàn),一方面解決java的單繼承問(wèn)題,實(shí)現(xiàn)了強(qiáng)大的可接插性
2.抽象類(lèi)提供了部分實(shí)現(xiàn),抽象類(lèi)是不能實(shí)例化的,抽象類(lèi)的存在主要是可以把公共的代碼移植到抽象類(lèi)中
3.面向接口編程,而不是面向具體編程
4.開(kāi)發(fā)中優(yōu)先選擇接口(因?yàn)槔^承抽象類(lèi)后,此類(lèi)將無(wú)法再繼承,所以會(huì)喪失此類(lèi)的靈活性)
2.集合
SET LIST MAP
一、
1.Set:,無(wú)序,元素不可重復(fù)(但是元素在set中的位置是有該元素的HashCode決定的,其位置其實(shí)是固定的)
2.List:有序,列表存儲(chǔ),元素可重復(fù)
3.Map:無(wú)序,元素可重復(fù)
二、
1.Set接口:有兩個(gè)實(shí)現(xiàn)類(lèi)(HashSet(底層由HashMap實(shí)現(xiàn)),LinkedHashSet)
2.List接口:有三個(gè)實(shí)現(xiàn)類(lèi)(
LinkedList:基于鏈表實(shí)現(xiàn),鏈表內(nèi)存是散亂的,每一個(gè)元素存儲(chǔ)本身內(nèi)存地址的同時(shí)還存儲(chǔ)下一個(gè)元素的地址。鏈表增刪快,查找慢;
ArrayList:非線程安全的,效率高;基于數(shù)組;便于索引,但不便于插入刪除
Vector:基于線程安全的,效率低;基于數(shù)組; )
3.Map接口:有三個(gè)實(shí)現(xiàn)類(lèi)(HashMap,HashTable,LinkedHashMap)
HashMap:非線程安全,高效,支持null;
HashTable:線程安全,低效,不支持null;
LinkedHashMap:是HashMap的一個(gè)子類(lèi),保存了記錄的插入順序
SortMap接口:TreeMap,能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是鍵值的升序排序
注:最常用的,冷門(mén)的除外)
3.常用的集合有哪些,談?wù)剬?duì)它們的理解? ?
SET ,LIST, MAP
1.1、特點(diǎn)
1.Set:,無(wú)序,元素不可重復(fù)(但是元素在 set 中的位置是有該元素
的 HashCode 決定的,其位置其實(shí)是固定的)
2.List:有序,列表存儲(chǔ),元素可重復(fù)
3.Map:無(wú)序,元素可重復(fù)
1.2、實(shí)現(xiàn)類(lèi)
1.t Set 接口:有兩個(gè)實(shí)現(xiàn)類(lèi)(HashSet(底層由 HashMap 實(shí)現(xiàn)),
LinkedHashSet)
2.t List 接口:有三個(gè)實(shí)現(xiàn)類(lèi)(
LinkedList:基于鏈表實(shí)現(xiàn),鏈表內(nèi)存是散亂的,每一個(gè)元素存
儲(chǔ)本身內(nèi)存地址的同時(shí)還存儲(chǔ)下一個(gè)元素的地址。鏈表增刪快,查找慢;
ArrayList:非線程安全的,效率高;基于數(shù)組;便于索引,但不
便于插入刪除
Vector:基于線程安全的,效率低;基于數(shù)組; )
- Map 接口:有三個(gè)實(shí)現(xiàn)類(lèi)(HashMap,HashTable,LinkedHashMap)
HashMap:非線程安全,高效,支持 null;
HashTable:線程安全,低效,不支持 null;
LinkedHashMap:是 HashMap 的一個(gè)子類(lèi),保存了記錄的插入順序
SortMap 接口:TreeMap,能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是鍵值
的升序排序。
4.List 和 和 Set 、Map 的區(qū)別?
Java 中的集合包括三大類(lèi):它們是 Set、List 和 Map,它們都處于
Java.util 包中,Set、List 和 Map 都是接口,它們有各自的實(shí)現(xiàn)類(lèi)。Set
的實(shí)現(xiàn)類(lèi)主要有 HashSet 和 TreeSet,List 的實(shí)現(xiàn)類(lèi)主要有 ArrayList,
Map 的實(shí)現(xiàn)類(lèi)主要有 HashMap 和 TreeMap。
Set 中的對(duì)象不按特定方式排序,并且沒(méi)有重復(fù)對(duì)象。但它的有些實(shí)現(xiàn)
類(lèi)能對(duì)集合中的對(duì)象按特定方式排序,例如 TreeSet 類(lèi),它可以按照默認(rèn)
排序,也可以通過(guò)實(shí)現(xiàn) Java.util.Comparator<Type>接口來(lái)自定義排序方
式。
List 中的對(duì)象按照索引位置排序,可以有重復(fù)對(duì)象,允許按照對(duì)象在
集合中的索引位置檢索對(duì)象,如通過(guò) list.get(i)方式來(lái)獲得 List 集合中
的元素。
Map 中的每一個(gè)元素包含一個(gè)鍵對(duì)象和值對(duì)象,它們成對(duì)出現(xiàn)。鍵對(duì)象
不能重復(fù),值對(duì)象可以重復(fù)
5.= =和 equals()的區(qū)別?
==:用于比較基本數(shù)據(jù)類(lèi)型,比較變量值是否相等,若相同,則為 true
用于比較引用數(shù)據(jù)類(lèi)型,比較的是指向內(nèi)存中的引用對(duì)象地址是否相同,若相同,
則為 true。
equals()方法:是用來(lái)比較兩個(gè)對(duì)象是否相等,即實(shí)際比較的是兩個(gè)對(duì)象的內(nèi)容是否相
同。
注意:equals 方法不能用于基本數(shù)據(jù)類(lèi)型的變量,如果沒(méi)有對(duì) equals 方法進(jìn)行重寫(xiě),
則比較的是引用類(lèi)型的變量所指向的對(duì)象的地址;
6.方法重寫(xiě)( Overloading)和方法重載( Overwrite)的區(qū)別?
方法重寫(xiě):一般出現(xiàn)在繼承(不同類(lèi))中,是子類(lèi)對(duì)父類(lèi)方法的重新實(shí)現(xiàn);
重寫(xiě)規(guī)則:
1)參數(shù)列表必須完全與被重寫(xiě)方法的一致,返回類(lèi)型必須完全與被重寫(xiě)方法的返回類(lèi)型一
致
2)構(gòu)造方法不能被重寫(xiě),聲明為 final 的方法不能被重寫(xiě),聲明為 static 的方法不能被重寫(xiě),
但是能夠被再次聲明
3)訪問(wèn)權(quán)限不能比父類(lèi)中被重寫(xiě)的方法的訪問(wèn)權(quán)限更高
4)重寫(xiě)的方法能夠拋出任何非強(qiáng)制異常,無(wú)論被重寫(xiě)的方法是否拋出異常。但是,重寫(xiě)的
方法不能拋出新的強(qiáng)制性異常,或者比被重寫(xiě)方法聲明的更廣泛的強(qiáng)制性異常,反之則可以
方法重載:在同一個(gè)類(lèi)中,方法名字相同,參數(shù)不同,方法體不同,是一個(gè)類(lèi)中多態(tài)性的一
種表現(xiàn);
注意:每個(gè)重載的方法(或者構(gòu)造函數(shù))都必須有一個(gè)獨(dú)一無(wú)二的參數(shù)類(lèi)型列表
重載規(guī)則:
方法名一致,參數(shù)列表中參數(shù)的順序,類(lèi)型,個(gè)數(shù)不同
重載與方法的返回值無(wú)關(guān),存在于父類(lèi)和子類(lèi),同類(lèi)中
可以拋出不同的異常,可以有不同修飾符
7.w throw 和 s throws 的區(qū)別?
throw:是用在語(yǔ)句拋出異常
特點(diǎn):
throw 語(yǔ)句用在方法體內(nèi),表示拋出異常,由方法體內(nèi)的語(yǔ)句處理。
throw 是具體向外拋異常的動(dòng)作,所以它是拋出一個(gè)異常實(shí)例,執(zhí)行 throw 則一定拋出了某
種異常
throws 是用在聲明方法時(shí),表示該方法可能要拋出異常
特點(diǎn):
1)throws 語(yǔ)句用在方法聲明后面,表示再拋出異常,由該方法的調(diào)用者來(lái)處理
- throws 主要是聲明這個(gè)方法會(huì)拋出這種類(lèi)型的異常,使它的調(diào)用者知道要捕獲這個(gè)
異常 - throws 表示出現(xiàn)異常的一種可能性,并不一定會(huì)發(fā)生這些異常
注意:拋出的異常可以使系統(tǒng)定義,也可以是自定義;使用 try,catch,finally 捕獲異常。
- 描述遇到過(guò)的異常有哪些?
(1)Error(錯(cuò)誤類(lèi)):是程序無(wú)法處理的錯(cuò)誤,錯(cuò)誤的發(fā)生屬于系統(tǒng)級(jí)別
(2)Exception(異常類(lèi)): 是程序本身可以處理的異常,一般是程序在操作數(shù)據(jù)錯(cuò)誤
時(shí)引發(fā),分為運(yùn)行時(shí)異常(RuntimeException)和非運(yùn)行時(shí)異常(編譯時(shí)異常)
注意:異常和錯(cuò)誤的區(qū)別:異常能被程序本身可以處理,錯(cuò)誤是無(wú)法處理
常見(jiàn)異常:
(1)java.lang.NullPointerException 空指針異常;出現(xiàn)原因:調(diào)用了未經(jīng)初始化的對(duì)
象或者是不存在的對(duì)象
(2)java.lang.ClassNotFoundException 指定的類(lèi)找不到;出現(xiàn)原因:類(lèi)的名稱(chēng)和路
徑加載錯(cuò)誤;通常都是程序試圖通過(guò)字符串來(lái)加載某個(gè)類(lèi)時(shí)可能引發(fā)異常
(3)java.lang.NumberFormatException 字符串轉(zhuǎn)換為數(shù)字異常;出現(xiàn)原因:字符型
數(shù)據(jù)中包含非數(shù)字型字符
(4)java.lang.IndexOutOfBoundsException 數(shù)組角標(biāo)越界異常;
(5)java.lang.IllegalArgumentException 方法傳遞參數(shù)錯(cuò)誤
(6)java.lang.ClassCastException 數(shù)據(jù)類(lèi)型轉(zhuǎn)換異常
(7)java.lang.NoClassDefFoundException 未找到類(lèi)定義錯(cuò)誤
(8)SQLException 操作數(shù)據(jù)庫(kù)異常
(9)java.lang.InstantiationException 實(shí)例化異常
(10)java.lang.NoSuchMethodException 方法不存在異常 - final, , finally, e finalize 的區(qū)別? ?
final:用于聲明屬性,方法和類(lèi),分別表示屬性不可變,方法不可覆蓋,被其修飾的類(lèi)
不可繼承。
Finally:異常處理語(yǔ)句結(jié)構(gòu)的一部分,表示總是執(zhí)行。
finalize:Object 類(lèi)的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候會(huì)調(diào)用被回收對(duì)象的此方法,
可以覆蓋此方法提供垃圾收集時(shí)的其他資源回收,例如關(guān)閉文件等。
- S tring、 StringBuffer、 StringB Br uilder 的區(qū)別?
(1)可變,不可變:
String:字符串常量,在修改時(shí)不會(huì)改變自身;若修改,等于重新生成新的字符串
對(duì)象
StringBuffer:在修改時(shí)會(huì)改變對(duì)象自身,每次操作都是對(duì) StringBuffer 對(duì)象本身進(jìn)
行修改,不是生成新的對(duì)象
使用場(chǎng)景:對(duì)字符串經(jīng)常改變情況下,主要方法:append(),insert()
等;
(2)線程是否安全:
String 對(duì)象定義后不可變,線程安全
StringBuffer 是線程安全的(對(duì)調(diào)用方法加入同步鎖),執(zhí)行效率較慢,適用于多
線程下操作字符串緩沖區(qū)大量數(shù)據(jù)
StringBuilder 是線程不安全的,適用于單線程下操作字符串緩沖區(qū)大量數(shù)據(jù)
共同點(diǎn):StringBuilder 與 StringBuffer 有公共父類(lèi) AbstractStringBuilder(抽象類(lèi))
StringBuilder、StringBuffer 的方法都會(huì)調(diào)用 AbstractStringBuilder 中的公共方法,如
super.append(...)。只是 StringBuffer 會(huì)在方法上加 synchronized 關(guān)鍵字,進(jìn)行同步。最后,
如果程序不是多線程的,那么使用 StringBuilder 效率高于 StringBuffer。
9.O IO 流
流是一組有順序的,有起點(diǎn)和終點(diǎn)的字節(jié)集合,是對(duì)數(shù)據(jù)傳輸?shù)目偡Q(chēng)或抽象。即數(shù)據(jù)在
兩設(shè)備間的傳輸稱(chēng)為流,流的本質(zhì)是數(shù)據(jù)傳輸,根據(jù)數(shù)據(jù)傳輸特性將流抽象為各種類(lèi),方便
更直觀的進(jìn)行數(shù)據(jù)操作。
10.Java 中有幾種類(lèi)型的流?分別是什么?
a Java 中的流,可以從不同的角度進(jìn)行分類(lèi)。
按流的方向分:輸入流和輸出流。
按處理數(shù)據(jù)單位分:字節(jié)流和字符流。
按實(shí)現(xiàn)功能分:節(jié)點(diǎn)流和處理流。
2.字節(jié)流和字符流的區(qū)別
1.字節(jié)流讀取的時(shí)候,讀到一個(gè)字節(jié)就返回一個(gè)字節(jié); 字符流使用了字節(jié)流讀到一個(gè)
或多個(gè)字節(jié)(中文對(duì)應(yīng)的字節(jié)數(shù)是兩個(gè),在 UTF-8 碼表中是 3 個(gè)字節(jié))時(shí)。先去查指定的
編碼表,將查到的字符返回。
2.字節(jié)流可以處理所有類(lèi)型數(shù)據(jù),如:圖片,MP3,AVI 視頻文件,而字符流只能處理
字符數(shù)據(jù)。只要是處理純文本數(shù)據(jù),就要優(yōu)先考慮使用字符流,除此之外都用字節(jié)流。
11.k break 和 e continue 的區(qū)別?
break 和 continue 都是用來(lái)控制循環(huán),主要是終止循環(huán);
break 用于完全結(jié)束一個(gè)循環(huán),跳出循環(huán)體執(zhí)行循環(huán)后面的語(yǔ)句;
continue 用于跳過(guò)本次循環(huán),執(zhí)行下次循環(huán);
12.如何實(shí)現(xiàn)對(duì)象克???
1). 實(shí)現(xiàn) Cloneable 接口并重寫(xiě) Object 類(lèi)中的 clone()方法;
2). 實(shí)現(xiàn) Serializable 接口,通過(guò)對(duì)象的序列化和反序列化實(shí)現(xiàn)克隆,可以實(shí)現(xiàn) 真正的深度克隆
13.數(shù)據(jù)類(lèi)型之間的轉(zhuǎn)換?
1)字符串如何轉(zhuǎn)基本數(shù)據(jù)類(lèi)型?
調(diào)用基本數(shù)據(jù)類(lèi)型對(duì)應(yīng)的包裝類(lèi)中的方法 parseXXX(String)或 valueOf(String)即可返回相應(yīng)
基本類(lèi)型;
2)基本數(shù)據(jù)類(lèi)型如何轉(zhuǎn)字符串?
一種方法是將基本數(shù)據(jù)類(lèi)型與空字符串(“”)連接(+)即可獲得其所對(duì)應(yīng)的字符串;另一
種方法是調(diào)用 String 類(lèi)中的 valueOf()方法返回相應(yīng)字符串
多線程網(wǎng)絡(luò)編程
14.線程和進(jìn)程的區(qū)別?
進(jìn)程:具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是操作系統(tǒng)進(jìn)行
資源分配和調(diào)度的一個(gè)獨(dú)立單位
線程:是進(jìn)程的一個(gè)實(shí)體,是 cpu 調(diào)度和分派的基本單位,是比進(jìn)程更小的可以獨(dú)立
運(yùn)行的基本單位
特點(diǎn):線程的劃分尺度小于進(jìn)程,這使多線程程序擁有高并發(fā)性
進(jìn)程在運(yùn)行時(shí)各自?xún)?nèi)存單元相互獨(dú)立,線程之間內(nèi)存共享,這使多線程編程可以擁
有更好的性能和用戶(hù)體驗(yàn)
注意:多線程編程對(duì)于其它程序是不友好的,占據(jù)大量 cpu 資源。
15.編寫(xiě)多線程程序的幾種實(shí)現(xiàn)方式(換個(gè)問(wèn)法:創(chuàng)建多線程的
方式)?
(1)通過(guò)繼承 Thread 類(lèi)
(2)通過(guò)實(shí)現(xiàn) Runnable 接口(推薦使用,因?yàn)?Java 中是單繼承,一個(gè)類(lèi)只有 一個(gè)父類(lèi),若繼承了 Thread 類(lèi),就無(wú)法在繼承其它類(lèi),顯然實(shí)現(xiàn) Runnable 接口更為靈活)
(3)通過(guò)實(shí)現(xiàn) Callable 接口(Java 5 之后)
. 15.請(qǐng)說(shuō)出同步線程及線程調(diào)度相關(guān)的方法?
1)wait():使一個(gè)線程處于等待(阻塞)狀態(tài),并且釋放所持有的對(duì)象的鎖;
2)sleep():使一個(gè)正在運(yùn)行的線程處于睡眠狀態(tài),是一個(gè)靜態(tài)方法,調(diào)用此方法要處理
InterruptedException 異常;
3)notify():?jiǎn)拘岩粋€(gè)處于等待狀態(tài)的線程,當(dāng)然在調(diào)用此方法的時(shí)候,并不能確切的喚醒
某一個(gè)等待狀態(tài)的線程,而是由 JVM 確定喚醒哪個(gè)線程,而且與優(yōu)先級(jí)無(wú)關(guān);
4)notityAll():?jiǎn)拘阉刑幱诘却隣顟B(tài)的線程,該方法并不是將對(duì)象的鎖給所有線程,而
是讓它們競(jìng)爭(zhēng),只有獲得鎖的線程才能進(jìn)入就緒狀態(tài);
注意:java 5 通過(guò) Lock 接口提供了顯示的鎖機(jī)制,Lock 接口中定義了加鎖(lock()方法)
和解鎖(unLock()方法),增強(qiáng)了多線程編程的靈活性及對(duì)線程的協(xié)調(diào)
17.啟動(dòng)一個(gè)線程是調(diào)用 run) ()方法還是 start()方法?
啟動(dòng)一個(gè)線程是調(diào)用 start()方法,使線程所代表的虛擬處理機(jī)處于可運(yùn)行狀態(tài),這意味著它可以由 JVM 調(diào)度并執(zhí)行,這并不意味著線程就會(huì)立即運(yùn)行。
run()方法是線程啟動(dòng)后要進(jìn)行回調(diào)(callback)的方法。
18.什么是線程池,有哪些常用線程池?
就是事先創(chuàng)建若干個(gè)可執(zhí)行的線程放入一個(gè)池(容器)中,需要的時(shí)候從池中獲取線程
不用自行創(chuàng)建,使用完畢不需要銷(xiāo)毀線程而是放回池中,從而減少創(chuàng)建和銷(xiāo)毀線程對(duì)象的開(kāi)
銷(xiāo)。
常用線程池:
(1)newSingleThreadExecutor:創(chuàng)建一個(gè)單線程的線程池,此線程池保證所有任務(wù)的
執(zhí)行順序按照任務(wù)的提交順序執(zhí)行。
(2)newFixedThreadPool:創(chuàng)建固定大小的線程池,每次提交一個(gè)任務(wù)就創(chuàng)建一個(gè)線
程,直到線程達(dá)到線程池的最大大小。
(3)newCachedThreadPool:創(chuàng)建一個(gè)可緩存的線程池,此線程池不會(huì)對(duì)線程池大小
做限制,線程池大小完全依賴(lài)于操作系統(tǒng)(或者說(shuō) JVM)能夠創(chuàng)建的最大線程大小。
(4)newScheduledThreadPool:創(chuàng)建一個(gè)大小無(wú)限的線程池,此線程池支持定時(shí)以及
周期性執(zhí)行任務(wù)的需求。
(5)newSingleThreadExecutor:創(chuàng)建一個(gè)單線程的線程池。此線程池支持定時(shí)以及周
期性執(zhí)行任務(wù)的需求。
19.什么是死鎖?
兩個(gè)進(jìn)程都在等待對(duì)方執(zhí)行完畢才能繼續(xù)往下執(zhí)行的時(shí)候就發(fā)生了死鎖。結(jié)果就是兩個(gè)進(jìn)程 都陷入了無(wú)限的等待中。
20.如何確保 N N 個(gè)線程可以訪問(wèn) N N 個(gè)資源同時(shí)又不導(dǎo)致死鎖?
使用多線程的時(shí)候,一種非常簡(jiǎn)單的避免死鎖的方式就是:指定獲取鎖的順序,并強(qiáng)制線程按照指定的順序獲取鎖。因此,如果所有的線程都是以同樣的順序加鎖和釋放鎖,就不會(huì)出現(xiàn)死鎖了。
21.獲得一個(gè)類(lèi)的類(lèi)對(duì)象有哪些方式?
1):類(lèi)型.class,例如:String.class
2):對(duì)象.getClass(),例如:”hello”.getClass()
3):Class.forName(),例如:Class.forName(“java.lang.String”)
22.簡(jiǎn)述下你了解的設(shè)計(jì)模式?
一、設(shè)計(jì)模式的分類(lèi)(加粗為常用)
總體來(lái)說(shuō)設(shè)計(jì)模式分為三大類(lèi):
創(chuàng)建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
結(jié)構(gòu)型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模
式、享元模式。
行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責(zé)任鏈模式、
命令模式、備忘錄模式、狀態(tài)模式、訪問(wèn)者模式、中介者模式、解釋器模式。
二、單例模式
單例設(shè)計(jì)模式
單例模式的好處:
1.某些類(lèi)的創(chuàng)建比較頻繁,對(duì)于一些大型的對(duì)象,這是一筆很大的開(kāi)銷(xiāo)。
2.省去了new的操作,節(jié)省了內(nèi)存的開(kāi)銷(xiāo),減輕了GC的壓力。
3.有些情況只能用單例的設(shè)計(jì)模式,例如,一些交易核心,只能用一個(gè)對(duì)象,不然就會(huì)亂套了。
餓漢式:(線程安全的)
// 私有的構(gòu)造方法
private Singleton(){
}
// 指向自己實(shí)例的私有靜態(tài)引用
private static Singleton singleton = new Singleton();
// 以自己實(shí)例為返回值的靜態(tài)的公有的方法
public static Singleton getInstance() {
return singleton;
}
}
懶漢式(線程不安全)
public class Singleton {
// 私有的構(gòu)造方法
private Singleton() {
}
// 不建立對(duì)象
private static Singleton singleton = null;
// 以自己實(shí)例為返回值的靜態(tài)的公有的方法
public static Singleton getInstance() {
if (singleton == null) {// 先判斷是否為空
singleton = new Singleton();// 如果為空建立對(duì)象
}
return singleton;
}
}
注:可以通過(guò)枚舉實(shí)現(xiàn)單例模式的絕對(duì)單例
三、工廠模式
意圖:定義一個(gè)創(chuàng)建對(duì)象的接口,讓其子類(lèi)自己決定實(shí)例化哪一個(gè)工廠類(lèi),工廠模式使其
創(chuàng)建過(guò)程延遲到子類(lèi)進(jìn)行。
主要解決:主要解決接口選擇的問(wèn)題。
何時(shí)使用:我們明確地計(jì)劃不同條件下創(chuàng)建不同實(shí)例時(shí)。
如何解決:讓其子類(lèi)實(shí)現(xiàn)工廠接口,返回的也是一個(gè)抽象的產(chǎn)品。
關(guān)鍵代碼:創(chuàng)建過(guò)程在其子類(lèi)執(zhí)行
四、適配器模式
意圖:將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。適配器模式使得原本由于接口不
兼容而不能一起工作的那些類(lèi)可以一起工作。
主要解決:主要解決在軟件系統(tǒng)中,常常要將一些"現(xiàn)存的對(duì)象"放到新的環(huán)境中,而新環(huán)
境要求的接口是現(xiàn)對(duì)象不能滿(mǎn)足的。
何時(shí)使用: 1、系統(tǒng)需要使用現(xiàn)有的類(lèi),而此類(lèi)的接口不符合系統(tǒng)的需要。 2、想要建立
一個(gè)可以重復(fù)使用的類(lèi),用于與一些彼此之間沒(méi)有太大關(guān)聯(lián)的一些類(lèi),包括一些可能在將來(lái)引
進(jìn)的類(lèi)一起工作,這些源類(lèi)不一定有一致的接口。 3、通過(guò)接口轉(zhuǎn)換,將一個(gè)類(lèi)插入另一個(gè)類(lèi)
系中。(比如老虎和飛禽,現(xiàn)在多了一個(gè)飛虎,在不增加實(shí)體的需求下,增加一個(gè)適配器,在
里面包容一個(gè)虎對(duì)象,實(shí)現(xiàn)飛的接口。)
如何解決:繼承或依賴(lài)(推薦)。
關(guān)鍵代碼:適配器繼承或依賴(lài)已有的對(duì)象,實(shí)現(xiàn)想要的目標(biāo)接口。
作者:天道灬酬勤
來(lái)源:簡(jiǎn)書(shū)