版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
計(jì)算機(jī)類面試專業(yè)問題
2007-12-1100:01
1、java
因?yàn)槲彝兜穆毼恢饕莏ava相關(guān)的,所以這方面積累的經(jīng)驗(yàn)比較多一下。
這部分考
查的重點(diǎn)主要有:java基本語法,多線程,異常處理,抽象類,匿名類,接口,
MVC架構(gòu)
,設(shè)計(jì)模式,Servlet,Struts,Spring,J2EE。以下是我遇見過的面試問題:
1)transient和volatile是java關(guān)鍵字嗎?(瞬聯(lián))
transient:
java有個(gè)特點(diǎn)就是序列化,簡(jiǎn)單地來說就是可以將這個(gè)類存儲(chǔ)在物理空間(當(dāng)然還是
以文件的形式存在),那么當(dāng)你從本地還原這個(gè)文件時(shí),你可以將它轉(zhuǎn)換為它本身。這可以
極大地方便網(wǎng)絡(luò)上的一些操作,但同時(shí),因?yàn)樯婕暗桨踩珕栴},所以并不希望把類里面所
有的東西都能存儲(chǔ)(因?yàn)槟菢?,別人可以通過序列化知道類里面的內(nèi)容),那么我們就可
以用上transient這個(gè)關(guān)鍵字,它的意思是臨時(shí)的,即不會(huì)隨類一起序列化到本地,所以當(dāng)
還原后,這個(gè)關(guān)健字定義的變量也就不再存在。
volatile:
Volatile修飾的成員變量在每次被線程訪問時(shí),都強(qiáng)迫從共享內(nèi)存中重讀該成員變量
的值。而且,當(dāng)成員變量發(fā)生變化時(shí),強(qiáng)迫線程將變化值回寫到共享內(nèi)存。這樣在任何時(shí)刻,
兩個(gè)不同的線程總是看到某個(gè)成員變量的同一個(gè)值。
2)抽象類和接口有什么區(qū)別?(瞬聯(lián))
1>飛機(jī)會(huì)飛,鳥會(huì)飛,他們都繼承了同一個(gè)接口“飛”;但是F22屬于飛機(jī)抽象類,鴿子
屬于鳥抽象類。
2>就像鐵門木門都是門(抽象類),你想要個(gè)門我給不了(不能實(shí)例化),但我可以給
你個(gè)具體的鐵門或木門(多態(tài));而且只能是門,你不能說它是窗(單繼承);一個(gè)門可以
有鎖(接口)也可以有門鈴(多實(shí)現(xiàn))。門(抽象類)定義了你是什么,接口(鎖)規(guī)定了
你能做什么(一個(gè)接口最好只能做一件事,你不能要求鎖也能發(fā)出聲音吧(接口污染))。
抽象類和接口有什么區(qū)別?
簡(jiǎn)單來說,
接口是公會(huì)的,里面不能有私有的方法或變量,是用于讓別人使用的,而抽象類是可以有私
有方法或私有變量的.
另外,實(shí)現(xiàn)接口的-?定要實(shí)現(xiàn)接口里定義的所有方法,而實(shí)現(xiàn)抽象類可以有選擇地重寫需要
用到的方法,一般的應(yīng)用里,最頂級(jí)的是接口,然后是抽象類實(shí)現(xiàn)接口,最后才到具體類實(shí)
現(xiàn)。
還有,接口可以實(shí)現(xiàn)多重繼承,而一個(gè)類只能繼承一個(gè)超類,但可以通過繼承多個(gè)接U實(shí)現(xiàn)
多重繼承,接口還有標(biāo)識(shí)(里面沒有任何方法,如Remote接口)和數(shù)據(jù)共享(里面的變量
全是常量)的作用.
接口和抽象類的區(qū)別,我覺得主要是兩點(diǎn),一個(gè)是抽象類里還可以有非抽象的方法,雖然抽
象類仍無法實(shí)例化,但是其子類可以,也就是說這些非抽象函數(shù)仍可以被多態(tài)調(diào)用,這也是
抽象類為什么沒有完全被接口取代的原因。接口就是相反了,不過接口也有一個(gè)優(yōu)勢(shì)是抽象
類無法比擬,就是類可以繼承多個(gè)接口,而抽象類和普通類一樣,只能繼承一個(gè),所以接口
可以解決多重繼承問題。
抽象類可以只實(shí)現(xiàn)部分方法,接口則必須實(shí)現(xiàn)其全部方法;抽象類的方法可以有抽象方法,
也可以有普通方法,接口里的方法必須是抽象方法;抽象類的方法的訪問權(quán)限可以多種,接
口的方法的訪問權(quán)限只能是public;抽象類的子類只能繼承一個(gè)抽象類,而實(shí)現(xiàn)接口的類
可以同時(shí)實(shí)現(xiàn)多個(gè)接口.
籠統(tǒng)點(diǎn)說:
接口=定義了要做的所有事情,但自己啥也不干
抽象類=做了部分共做,剩下的他不干了,等后來人繼續(xù)完成
這就是區(qū)別!
抽象類的成員可以具有訪問級(jí)別,而接口的成員全部public級(jí)別
抽象類可以包含字段,而接口不可以,
抽象類可以繼承接口,而接口不能繼承抽象類
抽象類的成員可以具有具體實(shí)現(xiàn),而接口不行
抽象的子類可以選擇性實(shí)現(xiàn)其基類的抽象方法,而接口的子類必須全部實(shí)現(xiàn)
2)能說一下java的反射機(jī)制嗎?(瞬聯(lián))
JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;
對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意?個(gè)方法:這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象
的方法的功能稱為java語言的反射機(jī)制。
Java反射機(jī)制主要提供了以卜功能:在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類;在運(yùn)行時(shí)
構(gòu)造任意一個(gè)類的對(duì)象;在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法;在運(yùn)行時(shí)調(diào)用
任意一個(gè)對(duì)象的方法;生成動(dòng)態(tài)代理。
4)在java中怎樣實(shí)現(xiàn)多線程?(瞬聯(lián))
5)你用過哪種設(shè)計(jì)模式?(瞬聯(lián),IBM,aspenTech)
6)請(qǐng)說一下MVC架構(gòu)(瞬聯(lián),IBM,aspenTech)
7)如果類a繼承類b,實(shí)現(xiàn)接口c,而類b和接口c中定義了同名變量,請(qǐng)問會(huì)
出現(xiàn)什么問題?(瞬聯(lián))
8)請(qǐng)說一下java中為什么要引入內(nèi)部類?還有匿名內(nèi)部類?(瞬聯(lián),IBM)
9)請(qǐng)說一下final,finally和finalize的區(qū)別?(瞬聯(lián))
10)請(qǐng)說一下HTTP請(qǐng)示的基本過程(IBM)
11)java中存在內(nèi)存泄漏問題嗎?請(qǐng)舉例說明?(IBM)
12)請(qǐng)說一下java中的內(nèi)存回收機(jī)制所采用的算法(IBM,瞬聯(lián))
13)請(qǐng)說一下System.gc()函數(shù)的作用。什么什么時(shí)候可以調(diào)用垃圾回收器?(瞬
聯(lián))
14)你做過的項(xiàng)目中采用了什么安全認(rèn)證機(jī)制?(IBM)
15)Math,round。什么作用?
2、C
C語言考查的重點(diǎn)一般是:指針、結(jié)構(gòu)體、條件編譯、全局變量/局部變量。
以下是
我遇見過的面試問題:
1)請(qǐng)說一下extemC的作用(漢略)
2)請(qǐng)說一下#ifdef...的作用(漢略)
3)C語言里,哪些變量是存放在堆里,哪些是存放在棧里?(普天)
4)C語言里的static關(guān)鍵詞是什么含義?(普天)
5)進(jìn)程和線程有什么區(qū)別?(普天)
3、C++
C++語言考查的重點(diǎn)主要有:多繼承,抽象類,虛函數(shù),拷貝構(gòu)造函數(shù),析
構(gòu)函數(shù),
動(dòng)態(tài)聯(lián)編,多態(tài),const,static0以下是我面試中遇到的問題:
1)你聽說過拷貝構(gòu)造函數(shù)嗎?能具體說一下它的作用嗎?(漢略)
2)析構(gòu)函數(shù)必須是虛函數(shù)嗎?為什么?(漢略)
3)你聽說過鉆石結(jié)構(gòu)嗎?請(qǐng)具體說一下(aspenTech)
4)什么是深拷貝?什么是淺拷貝?他們有什么區(qū)別?(aspenTech)
5)什么是虛函數(shù),什么是純虛函數(shù)?為什么引入虛函數(shù)和純虛函數(shù)?(漢略,
aspenTe
ch,普天)
6)請(qǐng)說一下面向?qū)ο蟮幕咎匦?。(aspenTech)
7)C++中的const關(guān)鍵定代表什么含義?跟C語言中的const有什么區(qū)別?
(aspenTech)
8)C++中的static關(guān)鍵定代表什么含義?跟C語言、Java中的static有什么
區(qū)別?(普天
)
4、數(shù)據(jù)結(jié)構(gòu)
這是面試中兒乎必考的部分??疾榈闹攸c(diǎn)有:鏈表,二叉樹前序、中序、后
序遍歷
(遞歸,非遞歸),二叉樹結(jié)點(diǎn)、層次的計(jì)算,樹轉(zhuǎn)二叉樹,各種排序算法(冒
泡排序
,快速排序,堆排序是重點(diǎn))。以下是我在面試中遇到過的問題:
1)請(qǐng)編寫程序,將一個(gè)鏈表倒置。(聯(lián)發(fā))
2)請(qǐng)編寫二叉樹的中序遍歷非遞歸算法。(新華社)
3)請(qǐng)編寫一個(gè)程序,實(shí)現(xiàn)將樹轉(zhuǎn)化成二叉樹。(華為)
4)一棵滿二叉樹有x個(gè)結(jié)點(diǎn),請(qǐng)問整棵二叉樹有多少結(jié)點(diǎn)?(新華社,中國信
保)
5)請(qǐng)編程實(shí)現(xiàn)一個(gè)堆排序算法/快速排序算法。(漢略)
5、數(shù)據(jù)庫
這也是面試重點(diǎn)內(nèi)容。主要考查點(diǎn)有:范式,1、2、3范式,事務(wù),內(nèi)連接,
外連接
,關(guān)系代數(shù),數(shù)據(jù)庫設(shè)計(jì)。以下是我遇到過的面試問題:
1)什么是范式、1范式、2范式、3范式?(百度,中航信,新華社,中國信保)
2)事務(wù)具有哪些特性?(中航信)
3)請(qǐng)說說什么是外連接、左外連接、右外連接?(aspenTech)
4)請(qǐng)說說關(guān)系代表中的兒種基本運(yùn)算?(中航信)
5)請(qǐng)對(duì)一個(gè)論壇進(jìn)行數(shù)據(jù)庫設(shè)計(jì),并說說你設(shè)計(jì)的數(shù)據(jù)庫滿足哪個(gè)范式(百度)
6)給你一個(gè)數(shù)據(jù)庫需求,請(qǐng)對(duì)數(shù)據(jù)庫進(jìn)行設(shè)計(jì),并根據(jù)要求寫出查詢語句(中
國信保)
6、網(wǎng)絡(luò)
這也是??嫉牟糠?。主要考查點(diǎn)有:OSI參考模型,TCP/IP參考模型。以下
是我遇到
過的具體面試問題:
1)請(qǐng)解釋一下OSI參考模型。(中國信保)
2)請(qǐng)解釋一下TCP/IP參考模型。(中國信保)
3)為什么現(xiàn)在的網(wǎng)絡(luò)最后采用了TCP/IP參考模型而沒用0SI參考模型?(中國
信保)
Java
1)transient和volatile是java關(guān)鍵字嗎
不常用到的關(guān)鍵字有:const,goto,native,strictfp,transient,volatile0
const和goto為java中的保留字。
1.native
native是方法修飾符。Native方法是由另外一種語言(如c/c++,FORTRAN,匯編)實(shí)現(xiàn)的
本地方法。因?yàn)樵谕獠繉?shí)現(xiàn)了方法,所以在java代碼中,就不需要聲明了,有點(diǎn)類似于借
口方法。Native可以和其他一些修飾符連用,但是abstract方法和Interface方法不能用native
來修飾。
Example:代碼
publicinterfaceTestinterface{
voiddoMethod();
}
publicclassTestimplementsTestinterface{
publicnativevoiddoMethod();
privatenativeintdoMethodB();
publicnativesynchronizedStringdoMcthodC();
staticnativevoiddoMethodD();
)
render_code();
為什么需要使用nativemethod?請(qǐng)參考:
/topic/72543javaNativeMethod初涉
2.strictfp
修飾類和方法,意思是FP-strict,精確浮點(diǎn),符合IEEE-754規(guī)范的。當(dāng)一個(gè)class或interface
用strictfp聲明,內(nèi)部所有的float和double表達(dá)式都會(huì)成為strictfp的。Interfacemethod不
能被聲明為strictfp的,class的可以。
Example:
代碼
strictfpinterfaceFPTest{
voidmethodA();
}
classFPClassimplementsFPTest{
publicvoidmethodA(){
publicvoidmcthodB(){
}
publicstrictfpvoidmethodC(){
}
}
classFPClassB{
strictfpvoidmethodA(){
}
}
render_code();
3.transient
變量修飾符。標(biāo)記為transient的變量,在對(duì)象存儲(chǔ)時(shí),這些變量狀態(tài)不會(huì)被持久化。當(dāng)對(duì)象
序列化的保存在存儲(chǔ)器上時(shí),不希望有些字段數(shù)據(jù)被保存,為了保證安全性,可以把這些字
段聲明為transiento
4.volatile
volatile修飾變量。在每次被線程訪問時(shí),都強(qiáng)迫從共享內(nèi)存中重讀該成員變量的值。而且,
當(dāng)成員變量發(fā)生變化時(shí),強(qiáng)迫線程將變化值回寫到共享內(nèi)存。這樣在任何時(shí)刻,兩個(gè)不同的
線程總是看到某個(gè)成員變量的同一個(gè)值。
看看JavaLanguageSpecification中的例子。
條件:一個(gè)線程不停的調(diào)用方法。ne(),一個(gè)線程不停的調(diào)用方法two()。我測(cè)試過多次,這
種情況好像一直沒有現(xiàn)。
抽象類和接口有什么區(qū)別?(瞬聯(lián))
聲明方法的存在而不去實(shí)現(xiàn)它的類被叫做抽象類(abstractclass),它用于要?jiǎng)?chuàng)建一個(gè)體現(xiàn)某
些基本行為的類,并為該類聲明方法,但不能在該類中實(shí)現(xiàn)該類的情況。不能創(chuàng)建abstract類
的實(shí)例。然而可以創(chuàng)建一個(gè)變量,其類型是一個(gè)抽象類,并讓它指向具體子類的一個(gè)實(shí)例。
不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。Abstract類的子類為它們父類中的所有抽象方法提供
實(shí)現(xiàn),否則它們也是抽象類為。取而代之,在子類中實(shí)現(xiàn)該方法。知道其行為的其它類可以
在類中實(shí)現(xiàn)這些方法。
接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過
實(shí)現(xiàn)這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個(gè)有程序體。接口只可以定
義staticfinal成員變量。接口的實(shí)現(xiàn)與子類相似,除了該實(shí)現(xiàn)類不能從接口定義中繼承行為。
當(dāng)類實(shí)現(xiàn)特殊接口時(shí),它定義(即將程序體給予)所有這種接U的方法。然后,它可以在實(shí)
現(xiàn)了該接口的類的任何對(duì)象卜.調(diào)用接口的方法。由于有抽象類,它允許使用接口名作為引用
變量的類型。通常的動(dòng)態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到接口類型或從接口類型轉(zhuǎn)換,
instanceof運(yùn)算符可以用來決定某對(duì)象的類是否實(shí)現(xiàn)了接口。
3)能說一下java的反射機(jī)制嗎?(瞬聯(lián))
JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;
對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象
的方法的功能稱為java語言的反射機(jī)制。
Java反射機(jī)制主要提供了以下功能:在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類;在運(yùn)行時(shí)構(gòu)造
任意一個(gè)類的對(duì)象;在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法;在運(yùn)行時(shí)調(diào)用任意
一個(gè)對(duì)象的方法;生成動(dòng)態(tài)代理。
1.得到某個(gè)對(duì)象的屬性
1publicObjectgetProperty(Objectowner,StringfieldName)throwsException{
2ClassownerClass=owner.getClass();
3
4Fieldfield=ownerClass.getField(fieldName);
5
6Objectproperty=field.get(owner);
7
8returnproperty;
9)
ClassownerClass=owner.getClass():得到該對(duì)象的Classo
Fieldfield=ownerClass.getField(fieldName):通過Class得到類聲明的屬性。
Objectproperty=field.get(owner):通過對(duì)象得到該屬性的實(shí)例,如果這個(gè)屬性是非公有的,
這里會(huì)報(bào)HlegalAccessException。
2.得到某個(gè)類的靜態(tài)屬性
1publicObjectgetStaticProperty(StringclassName,StringfieldName)
2throwsException{
3ClassownerClass=Class.forName(className);
4
5Fieldfield=ownerClass.getField(fieldName);
6
7Objectproperty=field.get(ownerClass);
8
9returnproperty;
10)
ClassownerClass=Class.fbrName(className):首先得到這個(gè)類的Classo
Fieldfield=ownerClass.getField(fieldName):和上面一樣,通過Class得到類聲明的屬性。
Objectproperty=field.get(ownerClass):這里和上面有些不同,因?yàn)樵搶傩允庆o態(tài)的,所以
直接從類的Class里取。
3.執(zhí)行某對(duì)象的方法
1publicObjectinvokeMethod(Objectowner,StringmethodName,Object[]args)throwsExcepti
on{
2
3ClassownerClass=owner.getClass();
4
5Classf]argsClass=newClass[args.length];
6
7for(inti=0,j=args.length;i<j;i-H-){
8argsClass[i]=args[i].getClass();
9}
10
11Methodmethod=ownerClass.getMethod(methodName,argsClass);
12
13returnmethod.invoke(owner,args);
14)
Classownerclass=owner.getClass():首先還是必須得到這個(gè)對(duì)象的Class0
5?9行:配置參數(shù)的Class數(shù)組,作為尋找Method的條件。
Methodmethod=ownerClass.getMethod(methodName,argsClass):通過Method名和參數(shù)的
Class數(shù)組得到要執(zhí)行的Methodo
method.invoke(owner,args):執(zhí)行該Method,invoke方法的參數(shù)是執(zhí)行這個(gè)方法的對(duì)象,和
參數(shù)數(shù)組。返回值是Object,也既是該方法的返回值。
4.執(zhí)行某個(gè)類的靜態(tài)方法
1publicObjectinvokeStaticMethod(StringclassName,StringmethodName,
2Object[]args)throwsException{
3ClassownerClass=Class.fbrName(className);
4
5Classf]argsClass=newClass[args.length];
6
7for(inti=0,j=args.length;i<j;i-H-){
8argsClass[i]=args[i].getClass();
9)
10
11Methodmethod=ownerClass.getMethod(methodName,argsClass);
12
13returnmethod.invoke(null,args);
14}
基本的原理和實(shí)例3相同,不同點(diǎn)是最后一行,invoke的一個(gè)參數(shù)是null,因?yàn)檫@是靜態(tài)方
法,不需要借助實(shí)例運(yùn)行。
5.新建實(shí)例
1
2publicObjectnewInstance(StringclassName,Object[]args)throwsException{
3ClassnewoneClass=Class.fbrName(className);
4
5Class[]argsClass=newClass[args.length];
6
7for(inti=0,j=args.length;i<j;i++){
8argsClass[i]=args[i].getClass();
9}
10
11Constructorcons=newoneClass.getConstructor(argsClass);
12
13returncons.newlnstance(args);
14
15)
這里說的方法是執(zhí)行帶參數(shù)的構(gòu)造函數(shù)來新建實(shí)例的方法。如果不需要參數(shù),可以直接使用
newoneClass.newInstance()來實(shí)現(xiàn)。
ClassnewoneClass=Class.fbrName(className):第一步,得到要構(gòu)造的實(shí)例的Classo
第5?第9行:得到參數(shù)的Class數(shù)組。
Constructorcons=newoneClass.getConstructor(argsClass):得到構(gòu)造子。
cons.newlnstance(args):新建實(shí)例。
6.判斷是否為某個(gè)類的實(shí)例
1publicbooleanisInstance(Objectobj,Classcis){
2returncls.islnstance(obj);
3)
7.得到數(shù)組中的某個(gè)元素
1publicObjectgetByArray(Objectarray,intindex){
2returnArray.get(array,index);
3)
4)在java中怎樣實(shí)現(xiàn)多線程?(瞬聯(lián))
與其他語言不一樣的是,線程的觀念在java是語言中是重要的,根深蒂固的,因?yàn)樵趈ava
語言中的線程系統(tǒng)是java語言自建的,java中有專門的支持多線程的API庫,所以你可以
以最快的速度寫一個(gè)支持線程的程序。在使用java創(chuàng)建線程的時(shí)候,你可以生成一個(gè)Thread
類或者他的子類對(duì)象,并給這個(gè)對(duì)象發(fā)送start。消息(程序可以向任何個(gè)派生自Runnable
接口的類對(duì)象發(fā)送start()消息的),這樣一來程序會(huì)一直執(zhí)行,直到run返回為止,此時(shí)該
線程就死掉了。
在java語言中,線程有如下特點(diǎn):
§在一個(gè)程序中而言,主線程的執(zhí)行位置就是main。而其他線程執(zhí)行的位置,程序員
是可以自定義的。值得注意的是對(duì)Applet也是一樣。
§每個(gè)線程執(zhí)行其代碼的方式都是一次順序執(zhí)行的。
§一個(gè)線程執(zhí)行其代碼是與其他線程獨(dú)立開來的。如果諸線程之間又相互協(xié)作的話,就
必須采用一定的交互機(jī)制。
§前面已經(jīng)說過,線程是共享地址空間的,如果控制不當(dāng),這里很有可能出現(xiàn)死鎖。
各線程之間是相互獨(dú)立的,那么本地變量對(duì)一個(gè)線程而言就是完全獨(dú)立,私有的。所以
呢,線程執(zhí)行時(shí),每個(gè)線程都有各自的本地變量拷貝。對(duì)象變量(instancevariable)在線程之
間是可以共享的,這也就是為什么在java中共享數(shù)據(jù)對(duì)象是如此的好用,但是java線程不
能夠武斷地訪問對(duì)象變量:他們是需要訪問數(shù)據(jù)對(duì)象的權(quán)限的。
二、準(zhǔn)備知識(shí)
在分析這個(gè)例子之前,然我們先看看關(guān)于線程的幾個(gè)概念,上鎖,信號(hào)量,和java所
提供的API。
上鎖
對(duì)于大多數(shù)的程序而言,他們都需要線程之間相互的通訊來完成整個(gè)線程的生命周期,
二實(shí)現(xiàn)線程之間同步的最簡(jiǎn)單的辦法就是上鎖。為了防止相互關(guān)聯(lián)的兩個(gè)線程之間錯(cuò)誤地訪
間共享資源,線程需要在訪問資源的時(shí)候上鎖和解鎖,對(duì)于鎖而言,有讀鎖,寫鎖和讀寫鎖
等不同的同步策略。在java中,所有的對(duì)象都有鎖:線程只需要使用synchronized關(guān)鍵字就
可以獲得鎖。在任時(shí)刻對(duì)于給定的類的實(shí)例,方法或同步的代碼塊只能被一個(gè)線程執(zhí)行。
這是因?yàn)榇a在執(zhí)行之前要求獲得對(duì)象的鎖。
/士旦啟-
1萬節(jié)里
通常情況下,多個(gè)線程所訪問為數(shù)不多的資源,那怎么控制呢?一個(gè)比較非常經(jīng)典而起
非常簡(jiǎn)單的辦法就是采用信號(hào)量機(jī)制。信號(hào)量機(jī)制的含義就是定義一個(gè)信號(hào)量,也就是說能
夠提供的連接數(shù);當(dāng)有一個(gè)線程占用了一個(gè)連接時(shí),信號(hào)量就減一;當(dāng)一個(gè)線程是放了連接
時(shí),信號(hào)量就加一。采用這種方法就可以簡(jiǎn)單有效地控制線程的同步問題,而且實(shí)現(xiàn)起來也
特別方便??聪旅娴拇a:
classSemaphore{
privateintcount;
publicSemaphore(intcount){
this.count=count;
}
publicsynchronizedvoidacquire(){
while(count==0){
trycatch(InterruptedExceptione){
//keeptrying
}
count—;
}
publicsynchronizedvoidrelease(){
count++;
notify();//alertathreadthat'sblockingonthissemaphore
}
)
java中提供了哪些api以編寫多線程程序
這里只列出幾個(gè)常用的方法和屬性值。
屬性值,有三個(gè)MAX_PRIORITY,MINPRIORITY,NORMPRIORITY
方法:
Thread。;〃建立一個(gè)線程
voidrun();〃對(duì)于--個(gè)繼承了Runnable接口的class而言,
〃他運(yùn)行一個(gè)線程,否著他什么都不做
voidsctPriority(intnewPriority);//設(shè)置優(yōu)先級(jí)
voidstart。;//運(yùn)行一個(gè)程序
voidsleep(longmillis);〃線程睡眠millis毫秒
staticvoidyield。;//臨時(shí)pause一個(gè)程序以便起他線程運(yùn)行
:程序示例
例一、
讓我們看看下面的例子。取錢的流程是輸入密碼,然后確定要取得金額,如果所取的金
額小于或等于可以取出的金額,WITHDRAW則返回TRUE,然后ATM機(jī)出錢,然后打印
清單;否則返回FALSE,然后打印清單。如下圖:
publicclassAutomatedTellerMachineextendsTeller{
publicvoidwithdraw(floatamount){
Accounta=getAccount();
if(a.deduct(amount))
dispense(amount);
printReceipt();
)
publicclassAccount{
privatefloattotal;
publicbooleandeduct(floatt){
if(t<=total){
total-=t;
returntrue;
)
returnfalse;
)
}
就這個(gè)例子而言,假設(shè)有這種情況,對(duì)同一個(gè)賬號(hào)可以在不同的地方取錢,在同一時(shí)間,
不同地點(diǎn),妻子和丈夫取錢,妻子輸入了賬號(hào)上的最大金額,丈夫也是一樣,假如妻子輸入
后已經(jīng)得到true的返回值,但是丈夫的線程所得到的值還沒有更新,這樣丈夫也能夠得到
true的返回值,這樣就出現(xiàn)了問題!這個(gè)問題怎么解決呢?在java里面提供了控制機(jī)制以保
證deduct操作時(shí)的原子性,那就是關(guān)鍵字synchronizedo
在Account的deduct方法加入synchronized就可以解決這個(gè)問題。
例二、
在這里我們用多線程中最典型的例子,生產(chǎn)者與消費(fèi)者問題。在這個(gè)例子里面我們定義
了生產(chǎn)者Producer,消費(fèi)者Consumer和倉庫Warehouse?:個(gè)類,在整個(gè)程序的生命周期里,
生產(chǎn)者隨機(jī)地制造出產(chǎn)品放到倉庫中,消費(fèi)者也是隨即地從倉庫中取出產(chǎn)品。
importexception.ProducerConsumerException;
*Consumer.java
*Consumer
*By:Jiabo
*Date:Mar21,2004
*Time:2:47:58PM
*/
publicclassConsumerextendsThread{
privateWarehousewarehouse;
privateStringid;
publicConsumer(Warehousewarehouse,Stringid){
this.warehouse=warehouse;
this.id=id;
}
publicvoidrun(){
inttmp=(int)Math.random()*10;
try(
warehouse.get(tmp);
System.out.println(nConsumer#"+this.id+”get"+tmp);
}catch(ProducerConsumerExceptione)
try(
sleep((int)(Math.random()*100));
}catch(InterruptedExceptione)
)
}
在這個(gè)類中,值得注意的?點(diǎn)是run方法中必須使用try-catch,因?yàn)?,消費(fèi)者從倉庫中
取東西時(shí)有可能諸如倉庫中的儲(chǔ)量不夠得異常,在消費(fèi)者里面也是一樣,只不過異常變?yōu)閭}
庫已滿。
importexception.*;
/**
*Producer.]ava
*Producer
*By:Jiabo
*Date:Mar21,2004
*Time:2:47:45PM
*/
publicclassProducerextendsThread{
privateWarehousewarehouse;
privateStringid;
publicProducer(Warehousewarehouse,Stringid){
this.warehouse=warehouse;
this.id=id;
}
publicvoidrun(){
inttmp=(int)Math.random()*10;
if(tmp!=0){
try{
warehouse.put(tmp);
System.out.println(,,Consumer#"+this.id+“put"+tmp);
}catch(ProducerConsumerExceptione)
)
try{
sleep((int)(Math.random()*100));
}catch(InterruptedExceptione)
最重要的一部分在Warehouse類,如上所說為了保證get何set的原子性,在這里使用了synchronized關(guān)鍵字,
并且在操作時(shí)拋出了可能跑出的異常。
5)你用過哪種設(shè)計(jì)模式?(瞬聯(lián),舊M,aspenTech)
MVC模式,靜態(tài)工廠模式,適配器模式,門面模式,DAO模式,單例模式,Template模式.
command模式
在網(wǎng)上看見了這篇文章,作者以輕松的語言比喻了java的23種模式,有很好的啟發(fā)作用。
創(chuàng)建型模式
1、FACTORY—追MM少不了請(qǐng)吃飯了,麥當(dāng)勞的雞翅和肯德基的雞翅都是MM愛吃的東
西,雖然口味有所不同,但不管你帶MM去麥當(dāng)勞或肯德基,只管向服務(wù)員說“來四個(gè)雞翅”就
行了。麥當(dāng)勞和肯德基就是生產(chǎn)雞翅的Factory
工廠模式:客戶類和工廠類分開。消費(fèi)者任何時(shí)候需要某種產(chǎn)品,只需向工廠請(qǐng)求即可。消
費(fèi)者無須修改就可以接納新產(chǎn)品。缺點(diǎn)是當(dāng)產(chǎn)品修改時(shí),工廠類也要做相應(yīng)的修改。如:如何創(chuàng)
建及如何向客戶端提供。
2、BUILDER—MM最愛聽的就是“我愛你”這句話了,見到不同地方的MM,要能夠用她們
的方言跟她說這句話哦,我有一個(gè)多種語言翻譯機(jī),上面每種語言都有一個(gè)按鍵,見到MM我
只要按對(duì)應(yīng)的鍵,它就能夠用相應(yīng)的語言說出“我愛你”這句話了,國外的MM也可以輕松搞掂,
這就是我的“我愛你"builder,(這一定比美軍在伊拉克用的翻譯機(jī)好賣)
建造模式:將產(chǎn)品的內(nèi)部表象和產(chǎn)品的生成過程分割開來,從而使一個(gè)建造過程生成具有不
同的內(nèi)部表象的產(chǎn)品對(duì)象。建造模式使得產(chǎn)品內(nèi)部表象可以獨(dú)立的變化,客戶不必知道產(chǎn)品內(nèi)部
組成的細(xì)節(jié)。建造模式可以強(qiáng)制實(shí)行一種分步驟進(jìn)行的建造過程。
3、FACTORYMETHOD—請(qǐng)MM去麥當(dāng)勞吃漢堡,不同的MM有不同的口味,要每個(gè)都
記住是一件煩人的事情,我一般采用FactoryMethod模式,帶著MM到服務(wù)員那兒,說“要?
個(gè)漢堡”,具體要什么樣的漢堡呢,讓MM直接跟服務(wù)員說就行了。
工廠方法模式:核心工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建的工作交給子類去做,
成為一個(gè)抽象工廠角色,僅負(fù)責(zé)給出具體工廠類必須實(shí)現(xiàn)的接口,而不接觸哪一個(gè)產(chǎn)品類應(yīng)當(dāng)被
實(shí)例化這種細(xì)節(jié)。
4、PROTOTYPE一跟MM用QQ聊天,一定要說些深情的話語了,我搜集了好多肉麻的情
話,需要時(shí)只要copy出來放到QQ里面就行了,這就是我的情話prototype了。(100塊錢-
份,你要不要)
原始模型模式:通過給出一個(gè)原型對(duì)象來指明所要?jiǎng)?chuàng)建的對(duì)象的類型,然后用復(fù)制這個(gè)原型
對(duì)象的方法創(chuàng)建出更多同類型的對(duì)象。原始模型模式允許動(dòng)態(tài)的增加或減少產(chǎn)品類,產(chǎn)品類不需
要非得有任何事先確定的等級(jí)結(jié)構(gòu),原始模型模式適用于任何的等級(jí)結(jié)構(gòu)。缺點(diǎn)是每一個(gè)類都必
須配備一個(gè)克隆方法。
5、SINGLETON—俺有6個(gè)漂亮的老婆,她們的老公都是我,我就是我們家里的老公
Sigleton,她們只要說道“老公”,都是指的同一個(gè)人,那就是我(剛才做了個(gè)夢(mèng)啦,哪有這么好
的事)
單例模式:?jiǎn)卫J酱_保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)
例單例模式。單例模式只應(yīng)在有真正的“單一實(shí)例”的需求時(shí)才可使用。
結(jié)構(gòu)型模式
6、ADAPTER—在朋友聚會(huì)上碰到了一個(gè)美女Sarah,從香港來的,可我不會(huì)說粵語,她
不會(huì)說普通話,只好求助于我的朋友kent了,他作為我和Sarah之間的Adapter,讓我和Sarah
可以相互交談了(也不知道他會(huì)不會(huì)耍我)
適配器(變木器)模式:把一個(gè)類的接口變換成客戶端所期待的另一種接口,從而使原本因
接口原因不匹配而無法一起工作的兩個(gè)類能夠一起工作。適配類可以根據(jù)參數(shù)返還一個(gè)合適的實(shí)
例給客戶端。
7、BRIDGE—早上碰到MM,要說早上好,晚上碰到MM,要說晚上好;碰到MM穿了件
新衣服,要說你的衣服好漂亮哦,碰到MM新做的發(fā)型,要說你的頭發(fā)好漂亮哦。不要問我“早
上碰到MM新做了個(gè)發(fā)型怎么說”這種問題,自己用BRIDGE組合一下不就行了
橋梁模式:將抽象化與實(shí)現(xiàn)化脫耦,使得二者可以獨(dú)立的變化,也就是說將他們之間的強(qiáng)關(guān)
聯(lián)變成弱關(guān)聯(lián),也就是指在一個(gè)軟件系統(tǒng)的抽象化和實(shí)現(xiàn)化之間使用組合/聚合關(guān)系而不是繼承
關(guān)系,從而使兩者可以獨(dú)立的變化。
8、COMPOSITE—Mary今天過生日?!拔疫^生日,你要送我?件禮物?!薄班?,好吧,去商
店,你自己挑?!薄斑@件T恤挺漂亮,買,這條裙子好看,買,這個(gè)包也不錯(cuò),買。”“喂,買了三
件了呀,我只答應(yīng)送一件禮物的哦?!薄笆裁囱?,T恤加裙子加包包,正好配成一套呀,小姐,麻
煩你包起來。":',MM都會(huì)用Composite模式了,你會(huì)了沒有?
合成模式:合成模式將對(duì)象組織到樹結(jié)構(gòu)中,可以用來描述整體與部分的關(guān)系。合成模式就
是一個(gè)處理對(duì)象的樹結(jié)構(gòu)的模式。合成模式把部分與整體的關(guān)系用樹結(jié)構(gòu)表示出來。合成模式使
得客戶端把一個(gè)個(gè)單獨(dú)的成分對(duì)象和由他們復(fù)合而成的合成對(duì)象同等看待。
9、DECORATOR—Mary過完輪到Sarly過生日,還是不要叫她自己挑了,不然這個(gè)月伙
食費(fèi)肯定玩完,拿出我去年在華山頂上照的照片,在背面寫上“最好的的禮物,就是愛你的Fita",
再到街上禮品店買了個(gè)像框(賣禮品的MM也很漂亮哦),再找隔壁搞美術(shù)設(shè)計(jì)的Mike設(shè)計(jì)了
一個(gè)漂亮的盒子裝起來……,我們都是Decorator,最終都在修飾我這個(gè)人呀,怎么樣,看懂了
嗎?
裝飾模式:裝飾模式以對(duì)客戶端透明的方式擴(kuò)展對(duì)象的功能,是繼承關(guān)系的一個(gè)替代方案,
提供比繼承更多的靈活性。動(dòng)態(tài)給一個(gè)對(duì)象增加功能,這些功能可以再動(dòng)態(tài)的撤消。增加由一些
基本功能的排列組合而產(chǎn)生的非常大量的功能。
10、FACADE—我有一個(gè)專業(yè)的Nikon相機(jī),我就喜歡自己手動(dòng)調(diào)光圈、快門,這樣照出
來的照片才專業(yè),但MM可不懂這些,教了半天也不會(huì)。幸好相機(jī)有Facade設(shè)計(jì)模式,把相
機(jī)調(diào)整到自動(dòng)檔,只要對(duì)準(zhǔn)目標(biāo)按快門就行了,一切由相機(jī)自動(dòng)調(diào)整,這樣MM也可以用這個(gè)
相機(jī)給我拍張照片了。
門面模式:外部與一個(gè)子系統(tǒng)的通信必須通過一個(gè)統(tǒng)一的門面對(duì)象進(jìn)行。門面模式提供一個(gè)
高層次的接口,使得子系統(tǒng)更易于使用。每一個(gè)子系統(tǒng)只有一個(gè)門面類,而且此門面類只有一個(gè)
實(shí)例,也就是說它是個(gè)單例模式。但整個(gè)系統(tǒng)可以有多個(gè)門面類。
11、FLYW日GHJ每天跟MM發(fā)短信,手指都累死了,最近買了個(gè)新手機(jī),可以把一些
常用的句子存在手機(jī)里,要用的時(shí)候,直接拿出來,在前面加上MM的名字就可以發(fā)送了,冉
不用一個(gè)字一個(gè)字敲了。共享的句子就是Flyweight,MM的名字就是提取出來的外部特征,根
據(jù)上下文情況使用。
享元模式:FLYW曰GHT在拳擊比賽中指最輕量級(jí)。享元模式以共享的方式高效的支持大
量的細(xì)粒度對(duì)象。享元模式能做到共享的關(guān)鍵是區(qū)分內(nèi)蘊(yùn)狀態(tài)和外蘊(yùn)狀態(tài)。內(nèi)蘊(yùn)狀態(tài)存儲(chǔ)在享元
內(nèi)部,不會(huì)隨環(huán)境的改變而有所不同。外蘊(yùn)狀態(tài)是隨環(huán)境的改變而改變的。外蘊(yùn)狀態(tài)不能影響內(nèi)
蘊(yùn)狀態(tài),它們是相互獨(dú)立的。將可以共享的狀態(tài)和不可以共享的狀態(tài)從常規(guī)類中區(qū)分開來,將不
可以共享的狀態(tài)從類里剔除出去。客戶端不可以直接創(chuàng)建被共享的對(duì)象,而應(yīng)當(dāng)使用一個(gè)工廠對(duì)
象負(fù)責(zé)創(chuàng)建被共享的對(duì)象。享元模式大幅度的降低內(nèi)存中對(duì)象的數(shù)量。
6)請(qǐng)說一下MVC架構(gòu)(瞬聯(lián),IBM,aspenTech)
MVC指的是Model,View,Controller嘀罩來-Model是負(fù)責(zé)資料眉,:ft責(zé)輿資料需1接:View
是負(fù)責(zé)資料的呈垣方式,可以是^真,統(tǒng)吉十1園等;Controller是^^系統(tǒng)的流程及決定如何呈現(xiàn)
資料
1解釋■/article/52/52575.shtm
模型一視圖一控制器(MVC)是XeroxPARC在八十年代為編程語言Smalltalk-80發(fā)明的一種軟件
設(shè)計(jì)模式,至今已被廣泛使用。最近幾年被推薦為Sun公司J2EE平臺(tái)的設(shè)計(jì)模式,并且受到越來越多的
使用ColdFusion和PHP的開發(fā)者的歡迎。模型一視圖一控制器模式是一個(gè)有用的工具箱,它有很多好
處,但也有一些缺點(diǎn)。
MVC如何工作
MVC是一個(gè)設(shè)計(jì)模式,它強(qiáng)制性的使應(yīng)用程序的輸入、處理和輸出分開。使用MVC應(yīng)用程序被分成:個(gè)
核心部件:模型、視圖、控制器.它們各自處理自己的任務(wù)。
視圖
視圖是用戶看到并與之交互的界面。對(duì)老式的Web應(yīng)用程序來說,視圖就是由HTML元素組成的界面,
在新式的Web應(yīng)用程序中,HTML依舊在視圖中扮演著重要的角色,但?些新的技術(shù)已層出不窮,它們
包括MacromediaFlash和象XHTML,XML/XSL,WML等一些標(biāo)識(shí)語言和Webservices.
如何處理應(yīng)用程序的界面變得越來越有挑戰(zhàn)性。MVC一個(gè)大的好處是它能為你的應(yīng)用程序處理很多不同的
視圖。在視圖中其實(shí)沒有真正的處理發(fā)生,不管這些數(shù)據(jù)是聯(lián)機(jī)存儲(chǔ)的還是一個(gè)雇員列表,作為視圖來講,
它只是作為一種輸出數(shù)據(jù)并允許用戶操縱的方式。
模型
模型表示企業(yè)數(shù)據(jù)和業(yè)務(wù)規(guī)則。在MVC的三個(gè)部件中,模型擁有最多的處理任務(wù)。例如它可能用象EJBs
和ColdFusionComponents這樣的構(gòu)件對(duì)象來處理數(shù)據(jù)庫。被模型返回的數(shù)據(jù)是中立的,就是說模型
與數(shù)據(jù)格式無關(guān),這樣一個(gè)模型能為多個(gè)視圖提供數(shù)據(jù)。由于應(yīng)用于模型的代碼只需寫一次就可以被多個(gè)
視圖重用,所以減少了代碼的重復(fù)性。
控制器
控制器接受用戶的輸入并調(diào)用模型和視圖去完成用戶的需求。所以當(dāng)單擊Web頁面中的超鏈接和發(fā)送
HTML表單時(shí),控制器本身不輸出任何東西和做任何處理。它只是接收請(qǐng)求并決定調(diào)用哪個(gè)模型構(gòu)件去處
理請(qǐng)求,然后用確定用哪個(gè)視圖來顯示模型處理返回的數(shù)據(jù)。
現(xiàn)在我們總結(jié)MVC的處理過程,首先控制器接收用戶的請(qǐng)求,并決定應(yīng)該調(diào)用哪個(gè)模型來進(jìn)行處理,然后
模型用業(yè)務(wù)邏輯來處理用戶的請(qǐng)求并返回?cái)?shù)據(jù),最后控制器用相應(yīng)的視圖格式化模型返回的數(shù)據(jù),并通過
表示層呈現(xiàn)給用戶。
為什么要使用MVC
大部分Web應(yīng)用程序都是用像ASP,PHP,或者CFML這樣的過程化語言來創(chuàng)建的。它們將像數(shù)據(jù)庫查
詢語句這樣的數(shù)據(jù)層代碼和像HTML這樣的表示層代碼混在一起。經(jīng)驗(yàn)比較豐富的開發(fā)者會(huì)將數(shù)據(jù)從表示
層分離開來,但這通常不是很容易做到的,它需要精心的計(jì)劃和不斷的嘗試。MVC從根本上強(qiáng)制性的將它
們分開.盡管構(gòu)造MVC應(yīng)用程序需要一些額外的工作,但是它給我們帶來的好處是無庸質(zhì)疑的。
首先,最重要的一點(diǎn)是多個(gè)視圖能共享一個(gè)模型,正如我所提及的,現(xiàn)在需要用越來越多的方式來訪問你
的應(yīng)用程序。對(duì)此,其中一個(gè)解決之道是使用MVC,無論你的用戶想要Flash界面或是WAP界面;用
?個(gè)模型就能處理它們。由于你已經(jīng)將數(shù)據(jù)和業(yè)務(wù)規(guī)則從表示層分開,所以你可以最大化的重用你的代碼
了。
由于模型返回的數(shù)據(jù)沒有進(jìn)行格式化,所以同樣的構(gòu)件能被不同界面使用。例如,很多數(shù)據(jù)可能用HTML
來表示,但是它們也有可能要用MacromediaFlash和WAP來表示。模型也有狀態(tài)管理和數(shù)據(jù)持久性處
理的功能,例如,基于會(huì)話的購物車和電子商務(wù)過程也能被Flash網(wǎng)站或者無線聯(lián)網(wǎng)的應(yīng)用程序所重用。
因?yàn)槟P褪亲园?,并且與控制器和視圖相分離,所以很容易改變你的應(yīng)用程序的數(shù)據(jù)層和業(yè)務(wù)規(guī)則。
如果你想把你的數(shù)據(jù)庫從MySQL移植到Oracle,或者改變你的基于RDBMS數(shù)據(jù)源到LDAP,只需改變
你的模型即可。一旦你正確的實(shí)現(xiàn)了模型,不管你的數(shù)據(jù)來自數(shù)據(jù)庫或是LDAP服務(wù)器,視圖將會(huì)正確的
顯示它們。由于運(yùn)用MVC的應(yīng)用程序的三個(gè)部件是相互對(duì)立,改變其中一個(gè)不會(huì)影響其它兩個(gè),所以依
據(jù)這種設(shè)計(jì)思想你能構(gòu)造良好的松偶合的構(gòu)件
對(duì)我來說,控制器的也提供了一個(gè)好處,就是可以使用控制器來聯(lián)接不同的模型和視圖去完成用戶的需求,
這樣控制器可以為構(gòu)造應(yīng)用程序提供強(qiáng)有力的手段。給定一些可重用的模型和視圖,控制器可以根據(jù)用戶
的需求選擇模型進(jìn)行處理,然后選擇視圖將處理結(jié)果顯示給用戶。
MVC的缺點(diǎn)
MVC的缺點(diǎn)是由于它沒有明確的定義,所以完全理解MVC并不是很容易。使用MVC需要精心的計(jì)劃,
由于它的內(nèi)部原理比較復(fù)雜,所以需要花費(fèi)?些時(shí)間去思考。
你將不得不花費(fèi)相當(dāng)可觀的時(shí)間去考慮如何將MVC運(yùn)用到你的應(yīng)用程序,同時(shí)由于模型和視圖要嚴(yán)格的
分離,這樣也給調(diào)試應(yīng)用程序到來了一定的困難。每個(gè)構(gòu)件在使用之前都需要經(jīng)過徹底的測(cè)試。一旦你的
構(gòu)件經(jīng)過了測(cè)試,你就可以毫無顧忌的重用它們了。
根據(jù)我個(gè)人經(jīng)驗(yàn),由于我們將?個(gè)應(yīng)用程序分成了三個(gè)部件,所以使用MVC同時(shí)也意味著你將要管理比
以前更多的文件,這一點(diǎn)是顯而易見的。這樣好像我們的工作量增加了,但是請(qǐng)記住這比起它所能帶給我
們的好處是不值?提。
MVC并不適介小吧其至中等規(guī)模的應(yīng)用程序,花費(fèi)大量時(shí)間將MVC應(yīng)用到規(guī)模并不是很大的應(yīng)用程序通
常會(huì)得不償失。
MVC是一條創(chuàng)建軟件的好途徑
MVC設(shè)計(jì)模式是?個(gè)很好創(chuàng)建軟件的途徑,它所提倡的?些原則,像內(nèi)容和顯示互相分離可能比較好理解。
但是如果你要隔離模型、視圖和控制器的構(gòu)件,你可能需要重新思考你的應(yīng)用程序,尤其是應(yīng)用程序的構(gòu)
架方面。如果你肯接受MVC,并且有能力應(yīng)付它所帶來的額外的工作和復(fù)雜性,MVC將會(huì)使你的軟件在
健壯性,代碼重用和結(jié)構(gòu)方面上一個(gè)新的臺(tái)階。
2解釋二http://www.ask321.com/ask8/ask151598.htm
Model-View-Controller
a.問題
如果開發(fā)?個(gè)企業(yè)級(jí)應(yīng)用,只需要?種客戶端的話,那么?切都非常容易解決。但真實(shí)情況是,我們必須
面對(duì)運(yùn)行在各種設(shè)備上客戶端,象PDA,WAP瀏覽器以及運(yùn)行在桌面上的瀏覽器,我們不得不開發(fā)不同
的應(yīng)用程序來處理來自不同客戶端的請(qǐng)求。數(shù)據(jù)訪問與現(xiàn)實(shí)將混淆在?起,可能會(huì)出現(xiàn)重復(fù)的數(shù)據(jù)訪問,
導(dǎo)致整個(gè)開發(fā)周期沒有必要的延長。
b.建議的解決方法
Model-View-Controller(MVC)開發(fā)模式被證明是有效的處理方法之-?它可以分離數(shù)據(jù)訪問和數(shù)據(jù)表
現(xiàn)。你可以開發(fā)一個(gè)有伸縮性的,便于擴(kuò)展的控制器,來維護(hù)整個(gè)流程。如圖1所示為整個(gè)模式的結(jié)構(gòu)。
MVC模式可以被映射到多層企業(yè)級(jí)的J2EE應(yīng)用上。
§所有的企業(yè)數(shù)據(jù)以及商業(yè)邏輯可以作為模式。
§視圖可以通過模式訪問數(shù)據(jù),并根據(jù)客戶端的要求來技示數(shù)據(jù)。視圖必須保證當(dāng)模式改變的時(shí)候,
數(shù)據(jù)顯示也必須同時(shí)改變。
§控制器用來結(jié)合模式和視圖,把客戶端來的請(qǐng)求轉(zhuǎn)換成模式能夠理解并執(zhí)行的請(qǐng)求,并且根據(jù)請(qǐng)
求以及執(zhí)行結(jié)果來決定下?次顯示那?個(gè)視圖。
根據(jù)以上的邏輯,你可以象這樣建立個(gè)應(yīng)用:
§應(yīng)用的商業(yè)邏輯由MVC中的模式也就是EJB來表現(xiàn)。模式必須處理由控制器傳遞過來的對(duì)數(shù)據(jù)
的訪問請(qǐng)求。
§多個(gè)頁面組成了MVC中的視圖,這些視圖必須隨模式一起更新。
§控制器是一系列接收用戶動(dòng)作的對(duì)象,他們把用戶的請(qǐng)求轉(zhuǎn)換成模式可理解的請(qǐng)求,并決定顯示
那個(gè)頁面當(dāng)模式處理完請(qǐng)求后。
圖1
c.要點(diǎn)
§MVC結(jié)構(gòu)適用于那些多用戶的,可擴(kuò)展的,可維護(hù)的,具有很高交互性的系統(tǒng)。
§MVC可以很好的表達(dá)用戶的交互和系統(tǒng)模式。
§很方便的用多個(gè)視圖來顯示多套數(shù)據(jù),是系統(tǒng)很方便的支持其他新的客戶端類型。
§代碼重復(fù)達(dá)到最低。
§由于分離了模式中的流控制和數(shù)據(jù)表現(xiàn),可以分清開發(fā)者的責(zé)任,另外,也可以加快產(chǎn)品推向市
場(chǎng)的時(shí)間
3解釋三/bbsjhZ14/1135.html
[轉(zhuǎn)帖]了解MVC架構(gòu)對(duì)于用Struts構(gòu)建的強(qiáng)大的Web應(yīng)用程序很重要
作者:cine發(fā)表時(shí)間:2002/12/0308:48am
了解MVC架構(gòu)對(duì)于用Struts構(gòu)建的強(qiáng)大的Web應(yīng)用程序很重要
Struts是雅加達(dá)的,個(gè)項(xiàng)目,它提供了一個(gè)方法,可以在?,個(gè)Web應(yīng)用程序中一起使用JavaServer
Pages(JSP)和servlets。它的目的是要解決完全由JSP或完全由servlet實(shí)現(xiàn)的應(yīng)用程序中的固有的
問
題。例如,servelts可以生成HTML頁面,但這么做很麻煩。另一方面,JSP可以很容易地用于傳統(tǒng)的
HTML頁面,但JSP頁面有其它的缺點(diǎn)。特別是,用JSP很難將內(nèi)容同內(nèi)容的顯示分開。很容易將Java
代
碼同HTML混在一起,結(jié)果做出的東西又慢乂難以維護(hù)。
然而,因?yàn)镴SP頁面容易使用,所以它們成為用Java構(gòu)建動(dòng)態(tài)的Web應(yīng)用程序的首選方法。除了容易編
程
外,JSP頁面也被改進(jìn)了,所以現(xiàn)在它們克服了以前的某些局限性。JavaBeans和標(biāo)記庫只是在基礎(chǔ)的
JSP技術(shù)上的幾個(gè)改進(jìn)。這種類型的方法一JSP頁面單獨(dú)負(fù)責(zé)處理輸入的請(qǐng)求和回復(fù)客戶端一被稱為
Model1架構(gòu)。
JavaServerPages是servlets的特殊情況,所以兩者可以「?起工作以彌補(bǔ)每個(gè)的不足,這似乎是合乎邏
輯的。這種類型的方法一你的Web架構(gòu)包含截然不同的但又互聯(lián)的處理數(shù)據(jù)模式、顯示代碼和程序控
制邏輯的JSP和servlet組件——被稱為Model2架構(gòu),或Model-View-Controller(MVC)架構(gòu)。
為了使用Struts架構(gòu)以及用JSP和servlets有效地編程,對(duì)MVC架構(gòu)的了解是很必要的。Model1和
MVC架
構(gòu)的主要不同就是請(qǐng)求是在哪里處理的。在Model1架構(gòu)中,請(qǐng)求通過JSP接收,主要通過JSP處理。
如
果JSP頁面需要來自任何其它應(yīng)用程序組件的服務(wù),如一個(gè)數(shù)據(jù)庫,那么你就從頁面做適當(dāng)?shù)恼{(diào)用,把
數(shù)據(jù)返回到頁面,安排數(shù)據(jù)的格式并顯示出來。你可以把一些代碼放到一個(gè)或多個(gè)JavaBean中,但是這
么做本身沒有將邏輯同顯示完全分離。
MVC方法采用了JSP和servlet方法的最佳特性,使這兩種技術(shù)可以協(xié)同工作。明確的是,servlet是處
理
層(控制器)。Servlet接收請(qǐng)求,很像Model1架構(gòu)中JSP頁面所做的那樣,并確定如何滿足那些請(qǐng)
求。這就意味著,servlet控制輸入的請(qǐng)求和輸出的回應(yīng)。
商業(yè)邏輯體現(xiàn)了MVC架構(gòu)中的模式。商業(yè)邏輯代碼為頁面做處理。如果進(jìn)入servlet的請(qǐng)求是一個(gè)數(shù)據(jù)庫
查詢,servlet就將這個(gè)請(qǐng)求傳送到個(gè)SQL調(diào)用或類似的數(shù)據(jù)庫代碼。如果請(qǐng)求是一個(gè)包括輸入信用卡
號(hào)的購買請(qǐng)求,那么事物處理代碼就接管了。在某種意義上,架構(gòu)的模式部分是讓應(yīng)用程序處于領(lǐng)先地
位的全部原因。
JSP頁面是顯示層(視圖),是用戶與應(yīng)用程序交互的地方。它提供輸入并顯示結(jié)果。頁面不應(yīng)該包括
任何腳本。它只是將數(shù)據(jù)傳送到servlet,并接收和顯示返回的數(shù)據(jù)。
該架構(gòu)的優(yōu)勢(shì)應(yīng)該是很明顯的。首先,它將計(jì)算和顯示清楚地分開了。結(jié)果很理想,在JSP頁面上沒有
出現(xiàn)處理過程,在servlet或商業(yè)邏輯中沒有數(shù)據(jù)格式。這種分離的另?個(gè)好處是Java程序員可以專注
于servlet代碼,HTML編寫者可以專注于JSP。第二點(diǎn),控制器servlet做頁面上的所有的決定。在
你
的頁面和邏輯中不會(huì)出現(xiàn)任何決策。這就提高了一個(gè)應(yīng)用程序的性能和可擴(kuò)展性,因?yàn)檎?qǐng)求可以被導(dǎo)向
架構(gòu)的不同的組件,甚至是不同的服務(wù)器。
運(yùn)用MVC架構(gòu)
MVC架構(gòu)沒有必要成為用于所有Java應(yīng)用程序的最佳方法。如你想象的那樣,它在準(zhǔn)備和編碼時(shí)往往
很
復(fù)雜一這對(duì)簡(jiǎn)單的應(yīng)用程序來說是沒必要的。當(dāng)頁面導(dǎo)航相對(duì)來說比較簡(jiǎn)單和固定,而且應(yīng)用程序中
的頁面結(jié)構(gòu)可以由一個(gè)簡(jiǎn)單的目錄結(jié)構(gòu)管理時(shí),Model1架構(gòu)仍然是最好的方法。這些應(yīng)用程序往往將
頁面流動(dòng)信息嵌入到頁面間的鏈接中。(JSP中出現(xiàn)forward。就告訴你,在該頁中有嵌入的邏輯,讓你
對(duì)顯示下一頁作出決定。)對(duì)于對(duì)流量或可擴(kuò)展性需求有限的靜態(tài)的應(yīng)用程序來說,標(biāo)準(zhǔn)的JSP模式仍
然是一個(gè)可行的選擇方案。
在一些情況下,你可能想把一個(gè)JSP應(yīng)用程序移植到MVC架構(gòu)中。例如,你可能開始時(shí)用的是Model1,
簡(jiǎn)單的JSP架構(gòu),隨著你的需求的增加,你會(huì)發(fā)現(xiàn)維護(hù)起來太復(fù)雜或太難了。如果你花很長的時(shí)間對(duì)應(yīng)
用程序做相對(duì)來說較簡(jiǎn)單的修改,或者如果你經(jīng)常在你的代碼中發(fā)現(xiàn)bug,那么你的JSP導(dǎo)向的應(yīng)用程序
也許就不再是合適的方法了。
隨著應(yīng)用程序的發(fā)展和變化,頁面的流動(dòng)和商業(yè)邏輯也增加了。應(yīng)用程序變得難以維護(hù),因?yàn)轫撁媪鲃?dòng)
邏輯跨多個(gè)頁面分布,而且商業(yè)邏輯可能開始存在于未計(jì)劃的地方。從Model1轉(zhuǎn)到MVC的最佳時(shí)機(jī)就
是
當(dāng)這些類型的維護(hù)問題出現(xiàn)的時(shí)候。
你也可以預(yù)先計(jì)劃將你的應(yīng)用程序從一個(gè)架構(gòu)移植到另一個(gè)架構(gòu)。當(dāng)你的應(yīng)用程序中的JSP頁面包含腳
本元素,定制標(biāo)記或JavaScript來執(zhí)行?個(gè)forward。操作時(shí),你可能想調(diào)整你最初的設(shè)計(jì),變成一種
用MVC架構(gòu)的設(shè)計(jì)。
Refactoring用在這兒是個(gè)不錯(cuò)的術(shù)語。它指的是以一種高度嚴(yán)謹(jǐn)?shù)姆绞街亟ùa結(jié)構(gòu)的一種技術(shù)。當(dāng)
你的代碼變得難以理解、修改和調(diào)試時(shí),你通常就開始考慮調(diào)整了。你可以用兒種方式來調(diào)整代碼:你
可以簡(jiǎn)單地重新命名變量和方法,或者將部分代碼移植到不同類型的執(zhí)行模式中。更多的關(guān)于調(diào)整及其
技術(shù)方面的信息,請(qǐng)?jiān)L問MartinFowler的網(wǎng)站或者閱讀他寫的書
Refactoring:ImprovingtheDesignofExistingCode。
在許多情況下,一開始就選擇MVC架構(gòu)是很有意義的,例如你的應(yīng)用程序是為廣泛的企業(yè)應(yīng)用而設(shè)計(jì)
的,或者在幾年內(nèi),你的應(yīng)用程序可能擴(kuò)展到一個(gè)相當(dāng)高的流量。設(shè)計(jì)一個(gè)MVC架構(gòu)需要有深謀遠(yuǎn)慮。
大多數(shù)程序員發(fā)現(xiàn)寫邏輯腳本或JavaBeans,以及用HTML顯示很容易。當(dāng)你設(shè)計(jì)一個(gè)MVC架構(gòu)時(shí),你
必須
首先進(jìn)行一個(gè)完整的設(shè)計(jì)。這就意味著,分析需要處理的請(qǐng)求的類型,確定哪些組件(JavaBean.數(shù)據(jù)
庫或其它servlets)將處理這些請(qǐng)求,以及對(duì)那些請(qǐng)求的回應(yīng)是如何顯示給用戶的。該設(shè)計(jì)的關(guān)鍵就
是請(qǐng)求和數(shù)據(jù)的流動(dòng)性。為MVC架構(gòu)設(shè)計(jì)應(yīng)用程序組件只是對(duì)你現(xiàn)在用JSP和servlets所做工作的擴(kuò)
展。
面臨的挑戰(zhàn)就是構(gòu)建一個(gè)servlet,它接收請(qǐng)求并把那些請(qǐng)求分到應(yīng)用程序的不同的組件。將一個(gè)數(shù)據(jù)
庫請(qǐng)求傳送到?個(gè)數(shù)據(jù)庫,或?qū)?個(gè)處理請(qǐng)求傳送到個(gè)JavaBean是很容易的,但是如果?個(gè)請(qǐng)求包含
這兩種元素,會(huì)怎樣呢?或者如果請(qǐng)求的性質(zhì)在一些處理出現(xiàn)前不能確定,又怎樣呢?
Struts構(gòu)架
該挑戰(zhàn)使我們乂回到Struts構(gòu)架。Struts提供了?個(gè)實(shí)現(xiàn)MVC架構(gòu)的高度自動(dòng)化的方式。它的結(jié)構(gòu)實(shí)現(xiàn)
了MVC,并包括一個(gè)控制器servlet、一組JSP頁面和應(yīng)用程序的商業(yè)邏輯??刂破鲗⒂脩粽?qǐng)求打包,并
把它們導(dǎo)向架構(gòu)中的其他對(duì)象。
Struts構(gòu)架是圍繞?個(gè)ActionMapping結(jié)構(gòu)的??刂破饔肁ctionMapping把HTTP消息形式的用戶
請(qǐng)求
轉(zhuǎn)換成應(yīng)用程序的動(dòng)作。ActionMapping指定請(qǐng)求的路徑、計(jì)劃處理請(qǐng)求的對(duì)象以及任何服務(wù)該請(qǐng)求需
要的其它信息。ActionMa
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024OEM貼牌生產(chǎn)合同
- 2024助學(xué)貸款合同承諾書
- 廠房安保設(shè)計(jì)方案
- 廠房倉庫裝修方案
- 華軟數(shù)電課程設(shè)計(jì)
- 華清遠(yuǎn)見小車課程設(shè)計(jì)
- 化工預(yù)熱器課程設(shè)計(jì)
- 球場(chǎng)承包合同書
- 華師大版七年級(jí)下冊(cè)數(shù)學(xué)期中考試試卷及答案
- 環(huán)保項(xiàng)目風(fēng)險(xiǎn)評(píng)估與預(yù)防預(yù)案
- 超市蔬果培訓(xùn)課件
- 語文立德樹人課題研究報(bào)告
- 正視挫折主題班會(huì)課件
- 定語從句(經(jīng)典)
- 研發(fā)資源的配置與利用
- 《招生話術(shù)技巧》課件
- 部編九年級(jí)語文上冊(cè)第二單元大單元教學(xué)設(shè)計(jì)
- 倉儲(chǔ)與配送管理倉儲(chǔ)作業(yè)管理
- 工程量計(jì)算表-標(biāo)準(zhǔn)模板
- UG NX 12.0三維建模及自動(dòng)編程項(xiàng)目教程 課件 項(xiàng)目四 曲面加工
- 自動(dòng)化設(shè)備加工時(shí)序圖
評(píng)論
0/150
提交評(píng)論