原文地址:http://sjtu.blog.sohu.com/108202346.html
------------------------------------------軟開(kāi)開(kāi)發(fā)篇-------------------------
--------------------------
在我剛進(jìn)軟開(kāi)的時(shí)候,我想,這有什么啊,泡著茶寫(xiě)點(diǎn)兒JAVA的日子么?最多用JAVA查
個(gè)數(shù)據(jù)庫(kù),插個(gè)數(shù)據(jù)庫(kù),還有啥?取錢(qián)存錢(qián)不也就是個(gè)人帳戶數(shù)據(jù)的此消彼長(zhǎng)么?IDE會(huì)幫你
發(fā)現(xiàn)任何一個(gè)細(xì)小的失誤,而JAVA的簡(jiǎn)單語(yǔ)法也不會(huì)讓你擔(dān)心有什么疑難雜癥.我不知道
跟我想法法一致的人有多少,但這確實(shí)就是我剛開(kāi)始看軟開(kāi)的眼光,安逸,掙閑錢(qián)的地方.
然則,就類(lèi)似于能量守恒的定理,你做的東西少,一定是有人幫你做的東西多,JAVA是
簡(jiǎn)單,可是那是JVM做的東西多,就如銀行,銀行的系統(tǒng)之復(fù)雜,是任何一個(gè)人無(wú)法想象的,
然而它的真正目的不是像IBM一樣要向別人出賣(mài)技術(shù),所以對(duì)人才要求很高,它只是要使成
熟的技術(shù)造福于自己特色業(yè)務(wù)的推廣,造福于針對(duì)業(yè)務(wù)的系統(tǒng)的開(kāi)發(fā),說(shuō)白了,是靠業(yè)務(wù)的
走紅而不是技術(shù)的復(fù)雜來(lái)掙錢(qián),.JAVA雖簡(jiǎn)單,但是要想徹頭徹尾學(xué)明白也難,那么銀行軟
開(kāi)不允許這種復(fù)雜性存在,它簡(jiǎn)單,但不徹底,那么我們就要讓它變得徹底的簡(jiǎn)單,我們要
繼續(xù)開(kāi)發(fā)自己的系統(tǒng),提供一套很容易的開(kāi)發(fā)平臺(tái),當(dāng)這套平臺(tái)開(kāi)發(fā)出來(lái)之后,就招一批能
夠泡著茶寫(xiě)JAVA的人去為業(yè)務(wù)服務(wù),所以這就是軟開(kāi)表面給大家造成這樣一種映向的原因
,工作難度是不大,但是絕對(duì)不是說(shuō)銀行系統(tǒng)無(wú)人,只是那些平臺(tái)的工作者沒(méi)有浮出水面,
或者相對(duì)來(lái)說(shuō)比較低調(diào)而已.
回到了我不屑的泡著茶寫(xiě)JAVA,啊,的確,難度是不大,數(shù)據(jù)庫(kù)查來(lái)查去,日志記來(lái)記去
,流程可能夠復(fù)雜,但不是算法的復(fù)雜,只是實(shí)現(xiàn)起來(lái)很煩而已.但是,這些人真的有足夠的
工夫泡茶么?大家喜歡用日新月異來(lái)形容當(dāng)今社會(huì)的發(fā)展,形勢(shì)日新月異了,業(yè)務(wù)需求一樣
也是日新月異,于是他們每天都要針對(duì)各種業(yè)務(wù)需求寫(xiě)出不同的程序來(lái),這個(gè)時(shí)候,他們的
關(guān)注點(diǎn)應(yīng)該從技術(shù)轉(zhuǎn)向業(yè)務(wù)上來(lái).業(yè)務(wù)需求給他們的壓力使他們?cè)贌o(wú)暇關(guān)注技術(shù)本身,所
以寫(xiě)JAVA的人也有寫(xiě)JAVA的人的難處,只是業(yè)務(wù)上的繁瑣,向來(lái)被純正的喜歡搞底層/搞算
法的人所鄙視,的確,你的腦筋可能是很活,但是物盡其才,如果真的有這樣的思維,是應(yīng)該
去搞一些高深的東西,研究技術(shù)的創(chuàng)新,寫(xiě)JAVA,面對(duì)各種應(yīng)用需求,是有些埋沒(méi),但是話又
說(shuō)回來(lái),這樣腦筋很活的人能干這樣的工作么?工作再枯燥也需要有人做,他們能有耐心應(yīng)
付這樣的枯燥么?
現(xiàn)在滿大街的小公司,沒(méi)有幾個(gè)是真正搞什么底層?xùn)|西的,大家其實(shí)都在針對(duì)各種業(yè)
務(wù)做各種項(xiàng)目,銀行的開(kāi)發(fā)之所以顯得有些乍眼,主要是因?yàn)?1,國(guó)企大氛圍;2,做出的東
西不用面對(duì)銷(xiāo)售壓力.其開(kāi)發(fā)從技術(shù)含量來(lái)講,并無(wú)本質(zhì)區(qū)別.
所以在銀行軟開(kāi)工作,絕大部分人,絕對(duì)部分學(xué)計(jì)算機(jī)的人,需要面臨的是一個(gè)方向的
調(diào)整,需要將注意力從技術(shù)的深度轉(zhuǎn)到業(yè)務(wù)的廣度上來(lái),一味盲目的覺(jué)得人家的工作乏味,
沒(méi)技術(shù)含量是不現(xiàn)實(shí)的,這也是我目前一個(gè)態(tài)度的轉(zhuǎn)變.
技術(shù)做到最后,就是大同,惟有業(yè)務(wù),才能使其中的努力變成鈔票,大家(尤其是學(xué)計(jì)算
機(jī)的人,尤其是并不適合搞算法,搞底層的人)如果想進(jìn)軟開(kāi),一定要有這樣的認(rèn)識(shí).
----------------------------------------------------------------------------
---------------------------------
------------------------------軟開(kāi)的壓力篇----------------------------------
---------------------------
銀行軟開(kāi)之所以有些乍眼,前面說(shuō)過(guò)一條,不用面對(duì)銷(xiāo)售的壓力,是,我們做出來(lái),業(yè)務(wù)
人員就得用,可是真的沒(méi)有壓力么?
我曾經(jīng)聽(tīng)說(shuō)過(guò)這樣一個(gè)例子:一個(gè)工行網(wǎng)點(diǎn)的客戶經(jīng)理,費(fèi)盡了口舌,花了半天工
夫,說(shuō)服了兩個(gè)客戶買(mǎi)基金,終于她們被說(shuō)動(dòng)了,坐下來(lái)填單子準(zhǔn)備簽字了,這個(gè)時(shí)候,系統(tǒng)
出故障了,交易無(wú)法進(jìn)行,沒(méi)辦法,客戶經(jīng)理只能含著淚,帶著她們出來(lái),把她們指給旁邊的
農(nóng)行/建行(本人屬于工行,這些時(shí)候自然偏向工行,其他銀行朋友勿怪).這個(gè)例子,體現(xiàn)了
銀行軟開(kāi)的一點(diǎn)壓力吧,不論什么時(shí)間,不論什么情況,不論你用什么手段什么方法,請(qǐng)你
給我保持住穩(wěn)定,如果系統(tǒng)慢,客戶經(jīng)理還可以陪客戶聊天,可是如果宕了,什么叫所有努
力付諸東流,這就是.
銀行在全國(guó)的網(wǎng)點(diǎn),大的數(shù)以萬(wàn)計(jì),小的也數(shù)以千計(jì)吧,各個(gè)地方,招來(lái)的柜員,那是怎
么樣素質(zhì)的都有,我曾聽(tīng)說(shuō)過(guò)這樣的柜員,這輩子她就會(huì)干兩件事,做取款的交易和存款的
交易,轉(zhuǎn)賬怎么辦?不會(huì)直接轉(zhuǎn)賬,先給A做提現(xiàn)的交易,再給B做存現(xiàn)的交易.內(nèi)部實(shí)現(xiàn)怎么
別扭,但是外部的易用性你可得給我做足了,要不人家網(wǎng)點(diǎn)柜員是真不明白.記得唐朝詩(shī)人
白居易還是王安石,每寫(xiě)一首詩(shī),都要問(wèn)老百姓能不能看懂,軟開(kāi)面臨的情況也很類(lèi)似,白
居易王安石歷史上就這么兩個(gè)人,然而你要求每個(gè)軟開(kāi)員工每個(gè)項(xiàng)目都能做到這樣,不覺(jué)
得有壓力么?尤其是心高氣傲的計(jì)算機(jī)人,那 更是不屑了.可是,這是軟開(kāi),如果想進(jìn)來(lái)玩,
請(qǐng)放下你的架子,認(rèn)真/細(xì)致的處理好所有細(xì)節(jié).
還有一個(gè)路人皆知的壓力,如何保障運(yùn)營(yíng)系統(tǒng)的安全,大家存錢(qián)的時(shí)候按完密碼鍵盤(pán)
了,系統(tǒng)沒(méi)有響應(yīng),柜員要求你重新輸入你會(huì)怎么想?難道不是我的密碼被盜了?你怎么能
保證?這樣的事情只要發(fā)生,只要桶上來(lái),整個(gè)銀行總部的領(lǐng)導(dǎo)層都會(huì)開(kāi)始關(guān)注這個(gè)問(wèn)題,
甚至銀監(jiān)會(huì)也要監(jiān)督你的處理方式.這個(gè)時(shí)候,軟開(kāi)員工身上的壓力將會(huì)可想而知,一旦最
后查明是程序的問(wèn)題,所有一干人等(開(kāi)發(fā)/測(cè)試/小組領(lǐng)導(dǎo)/部門(mén)領(lǐng)導(dǎo)),全部要受罰,這是
肯定的.網(wǎng)銀的運(yùn)營(yíng),得有多少加密措施來(lái)保障數(shù)據(jù)的安全,且不說(shuō)技術(shù)上的加密算法,就
拿業(yè)務(wù)來(lái)說(shuō),大家去辦個(gè)U盾,看那個(gè)網(wǎng)點(diǎn)工作人員得填多少單子,就知道銀行為保證安全
,得下多少精力了.
很多小公司,常年就給一個(gè)醫(yī)院/一個(gè)機(jī)關(guān)做項(xiàng)目,每做一個(gè),掙10幾萬(wàn),然后全組人出
動(dòng)到現(xiàn)場(chǎng),花幾天時(shí)間,解決各種安裝遇到的問(wèn)題,保證沒(méi)問(wèn)題后再大家都撤,老總請(qǐng)大家
吃飯.銀行是怎么樣?做一個(gè)項(xiàng)目,全國(guó)所有省份所有網(wǎng)點(diǎn)均要投產(chǎn),如果大家各自全都出
動(dòng),人手夠么?各種不一致的現(xiàn)象報(bào)上來(lái),就是招10倍人也解決不了,所以銀行軟開(kāi)壓力最
大的時(shí)候就是投產(chǎn)前夕,所有人從老總到小兵全部通宵達(dá)旦地守在電腦旁,應(yīng)付各種可能
問(wèn)題的出現(xiàn),而且作為高風(fēng)險(xiǎn)機(jī)構(gòu),銀行在投產(chǎn)時(shí)候遇到的問(wèn)題的解決,一定要準(zhǔn),一次性
成功!就如密碼鍵盤(pán)來(lái)說(shuō),出現(xiàn)問(wèn)題是系統(tǒng)不響應(yīng),馬上回來(lái)改了,自己測(cè)過(guò)之后沒(méi)問(wèn)題,再
發(fā)補(bǔ)丁,結(jié)果造成系統(tǒng)崩潰,你可以想象一下客戶的憤怒和不安!全中國(guó)這么大,我們不可
能到處跑過(guò)去看問(wèn)題,所以,怎么樣才能保證程序在全國(guó)跑都沒(méi)問(wèn)題,這是問(wèn)題,也是巨大
的壓力.
銀行軟開(kāi)的壓力,不來(lái)自于有沒(méi)有客戶,而來(lái)自于客戶太多,給我們系統(tǒng)造成的壓力,
無(wú)人問(wèn)津的悲哀和無(wú)數(shù)人目光如炬的質(zhì)詢,后果都一樣,讓你身心俱疲.
----------------------------------------------------------------------------
-------------------------------------
------------------------------銀行軟開(kāi)的發(fā)展篇------------------------------
-----------------------------
銀行軟開(kāi)的發(fā)展,對(duì)于學(xué)計(jì)算機(jī)的人來(lái)說(shuō),是一個(gè)不小的難題,也是很多人對(duì)于要不
要來(lái)這很猶豫的問(wèn)題,技術(shù)和業(yè)務(wù)上的難以抉擇.還有國(guó)企多少的一點(diǎn)特色對(duì)自己發(fā)展造
成的干擾.
是的,這些都是問(wèn)題,值得研究,第一個(gè)關(guān)于技術(shù)和業(yè)務(wù)的問(wèn)題,我不想再多說(shuō),以掙錢(qián)
為終點(diǎn),那么條條大路通羅馬,以境界的追求為終點(diǎn),軟開(kāi)可能不屬于一個(gè)好的地方,畢竟
你的心高高在上,不屑于一些簡(jiǎn)單的活.路是自己選的,怎么走都可以,但是有一點(diǎn)要注意,
軟開(kāi)是有一部分專(zhuān)搞技術(shù)的人的,只是因?yàn)殂y行軟開(kāi)的出發(fā)點(diǎn)是針對(duì)業(yè)務(wù)做開(kāi)發(fā),所以為
開(kāi)發(fā)提供更便捷方式的平臺(tái)方面的人屬于少而精的配置.因?yàn)橐恍﹪?guó)企的特色,進(jìn)來(lái)后可
能因?yàn)槲疫@篇文章,一些想要進(jìn)來(lái)做平臺(tái)的計(jì)算機(jī)人,有可能被領(lǐng)導(dǎo)分配到業(yè)務(wù)為主的開(kāi)
發(fā)部門(mén),關(guān)于這些人我想說(shuō)的是,軟開(kāi)屬于計(jì)算機(jī)研發(fā)為主的企業(yè)性質(zhì)單位,人與人之間的
關(guān)系,沾點(diǎn)國(guó)企的影子,卻遠(yuǎn)沒(méi)有那么復(fù)雜,關(guān)于自己角色的的定位,你可以跟領(lǐng)導(dǎo)好好溝
通你的長(zhǎng)處和你希望干的內(nèi)容,一般來(lái)說(shuō),領(lǐng)導(dǎo)是會(huì)多少考慮的,即便不能百分百滿足你需
要,百分之三十/四十/五十等等也能滿足一些,只會(huì)悶頭做技術(shù),不會(huì)與人交流的人還是不
要來(lái)了,這里不適合你,即便你不跟領(lǐng)導(dǎo)溝通,你也需要跟下面分行的人溝通,交流,是工作
需要.
有的人會(huì)說(shuō),銀行軟開(kāi)不掙錢(qián),掙錢(qián)的是那些懂業(yè)務(wù)的人,這里首先要明確,什么樣算
掙錢(qián),工資是每個(gè)人都掙的,要是拿這個(gè)說(shuō)的話就沒(méi)意思了.大家說(shuō)的應(yīng)該是提成/分紅的
那一類(lèi)人,的確,軟開(kāi)掙不到那樣一些錢(qián),那些屬于業(yè)務(wù)部該掙的錢(qián).我覺(jué)得大家在討論這
樣一些問(wèn)題的時(shí)候,首先要把自己擺正,軟開(kāi)的人,其實(shí)也就相當(dāng)于一個(gè)IT公司的人,IT公
司的那一部分分紅,軟開(kāi)一分錢(qián)都不會(huì)少,而且軟開(kāi)的錢(qián)有保證,不隨經(jīng)濟(jì)危機(jī)而起伏.平
時(shí)福利也還可以.大家在羨慕業(yè)務(wù)的人拿得多的時(shí)候,是否可曾想到自己公司的銷(xiāo)售在談
好一個(gè)項(xiàng)目的時(shí)候提成也是遠(yuǎn)勝于自己工資的呢?只要你自己肯轉(zhuǎn)變思路,專(zhuān)心學(xué)業(yè)務(wù),借
助于自己的技術(shù)優(yōu)勢(shì),以后去業(yè)務(wù)部分掙錢(qián)也不是沒(méi)可能,關(guān)鍵就在于自己怎么看,不能既
不想作出改變現(xiàn)狀的努力,又覺(jué)得人家掙錢(qián)掙那么多不公平.再者如果你實(shí)在干不了業(yè)務(wù),
那么就干技術(shù),轉(zhuǎn)管理或者技術(shù)做到死當(dāng)技術(shù)經(jīng)理,總之就是成為領(lǐng)導(dǎo),軟開(kāi)領(lǐng)導(dǎo)同樣掙不
少錢(qián),他們地位也和HP/IBM的高管地位一樣,也許錢(qián)一年比人家的少些,但是國(guó)企有國(guó)企的
福利,這個(gè)是外企不能比的.每個(gè)人都該知足,生活提高一點(diǎn),抱怨就該少一點(diǎn),自己已經(jīng)掙
了30W一年,夠花了,聽(tīng)說(shuō)別的部門(mén)一年年終獎(jiǎng)拿了20W,全年工資50W也該把心態(tài)放平和些,
不就是錢(qián)么,又不是不夠花,何不知足長(zhǎng)樂(lè)呢?(注:業(yè)務(wù)部門(mén)不包括那些網(wǎng)點(diǎn)的柜員,他們
工資很少的).
軟開(kāi)的發(fā)展空間最大的難處在我看來(lái),是這里雖然由業(yè)務(wù)指導(dǎo)開(kāi)發(fā),但是開(kāi)發(fā)量很大
,導(dǎo)致你也不能完全放下你的技術(shù),這樣技術(shù)和業(yè)務(wù)之間徘徊不定,最終會(huì)有礙人的成長(zhǎng),
而且他的技術(shù)為了業(yè)務(wù)開(kāi)發(fā)的便捷,被很好的簡(jiǎn)化了最后有可能技術(shù)沒(méi)學(xué)成技術(shù),業(yè)務(wù)也
沒(méi)懂多少.這個(gè)是確實(shí),一個(gè)地方不可能十全十美.
我的意見(jiàn)是,你一生比較想過(guò)安穩(wěn)的生活可以來(lái)這,你如果是一個(gè)有追求的人,并且腦
筋可以變通的人,也可以來(lái)這,你如果是是一個(gè)有追求的人,并且好學(xué)的人(無(wú)論是業(yè)務(wù)還
是技術(shù),都多得讓你學(xué)不完,當(dāng)你學(xué)得夠多就有資格提前成為領(lǐng)導(dǎo)了),也可以來(lái)這.一個(gè)有
追求的人,并且勤勉踏實(shí)的人也可以來(lái),有這么兩類(lèi)人,技術(shù)的大牛人不要來(lái),你應(yīng)該去百
度/GOOGLE發(fā)揮你的優(yōu)勢(shì)所在,有追求,但是沒(méi)有什么魄力改變現(xiàn)狀的人,就不要來(lái),免得一
輩子平庸的現(xiàn)狀可能讓你萬(wàn)分苦惱.
還有一個(gè)難處我也提一下,它終歸是國(guó)企,它注重能力,畢竟銀行的系統(tǒng)不能瞎來(lái),同
時(shí)也要求年限,年限一到才能往上升,所以不能忍的人也不要來(lái)了吧,當(dāng)然也可以來(lái)了再走
~呵呵
最后我說(shuō)一下薪資發(fā)展空間吧,現(xiàn)在銀行軟開(kāi)一般待遇都不差,但是升值空間,在你沒(méi)
成為領(lǐng)導(dǎo)之前漲幅不大,其實(shí)任何地方都一樣,只有當(dāng)領(lǐng)導(dǎo),工資才能有質(zhì)的變化,只是軟
開(kāi)要當(dāng)上領(lǐng)導(dǎo)的周期比外企要長(zhǎng)一些,也不會(huì)長(zhǎng)得不可理喻,大家有的總說(shuō)想來(lái)這,覺(jué)得穩(wěn)
定但是又嫌工資漲得不快,這就是典型的魚(yú)和熊掌都想得到的心理了,選擇了軟開(kāi),選擇了
國(guó)企的穩(wěn)定,必然要放棄一部分收入的增幅,既然思想不夠純粹,要為追求奮斗一生,而是
選擇既有保障也要有追求的奮斗,那么你的生命里必將在別的地方付出一些代價(jià),怎么樣
都能成功,問(wèn)題還是在于個(gè)人吧.
我簡(jiǎn)單說(shuō)明一下,工行軟開(kāi),屬于總行編制,恩,就這么多了.
代理模式
代理模式的作用是:
為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。在某些情況下,一個(gè)客戶不想或者不能直接引用另一個(gè)對(duì)象,而代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用。
代理模式一般涉及到的角色有:
抽象角色:聲明真實(shí)對(duì)象和代理對(duì)象的共同接口;
代理角色:代理對(duì)象角色內(nèi)部含有對(duì)真實(shí)對(duì)象的引用,從而可以操作真實(shí)對(duì)象,同時(shí)代理對(duì)象提供與真實(shí)對(duì)象相同的接口以便在任何時(shí)刻都能代替真實(shí)對(duì)象。同時(shí),代理對(duì)象可以在執(zhí)行真實(shí)對(duì)象操作時(shí),附加其他的操作,相當(dāng)于對(duì)真實(shí)對(duì)象進(jìn)行封裝。
真實(shí)角色:代理角色所代表的真實(shí)對(duì)象,是我們最終要引用的對(duì)象。
以下以《Java與模式》中的示例為例:
代碼: //抽象角色:
abstract public class Subject{
abstract public void request();
}
//真實(shí)角色:實(shí)現(xiàn)了Subject的request()方法。
public class RealSubject extends Subject{
public RealSubject(){
}
public void request(){
System.out.println("From real subject.");
}
}
//代理角色:
public class ProxySubject extends Subject{
private RealSubject realSubject; //以真實(shí)角色作為代理角色的屬性
public ProxySubject(){
}
public void request(){ //該方法封裝了真實(shí)對(duì)象的request方法
preRequest();
if( realSubject == null ){
realSubject = new RealSubject();
}
realSubject.request(); //此處執(zhí)行真實(shí)對(duì)象的request方法
postRequest();
}
private void preRequest(){
//something you want to do before requesting
}
private void postRequest(){
//something you want to do after requesting
}
}
//客戶端調(diào)用:
Subject sub=new ProxySubject();
Sub.request();
由以上代碼可以看出,客戶實(shí)際需要調(diào)用的是RealSubject類(lèi)的request()方法,現(xiàn)在用ProxySubject來(lái)代理RealSubject類(lèi),同樣達(dá)到目的,同時(shí)還封裝了其他方法(preRequest(),postRequest()),可以處理一些其他問(wèn)題。
另外,如果要按照上述的方法使用代理模式,那么真實(shí)角色必須是事先已經(jīng)存在的,并將其作為代理對(duì)象的內(nèi)部屬性。但是實(shí)際使用時(shí),一個(gè)真實(shí)角色必須對(duì)應(yīng)一個(gè)代理角色,如果大量使用會(huì)導(dǎo)致類(lèi)的急劇膨脹;此外,如果事先并不知道真實(shí)角色,該如何使用代理呢?這個(gè)問(wèn)題可以通過(guò)Java的動(dòng)態(tài)代理類(lèi)來(lái)解決。
2.動(dòng)態(tài)代理
Java動(dòng)態(tài)代理類(lèi)位于Java.lang.reflect包下,一般主要涉及到以下兩個(gè)類(lèi):
(1). Interface InvocationHandler:該接口中僅定義了一個(gè)方法Object:invoke(Object obj,Method method, Object[] args)。在實(shí)際使用時(shí),第一個(gè)參數(shù)obj一般是指代理類(lèi),method是被代理的方法,如上例中的request(),args為該方法的參數(shù)數(shù)組。這個(gè)抽象方法在代理類(lèi)中動(dòng)態(tài)實(shí)現(xiàn)。
(2).Proxy:該類(lèi)即為動(dòng)態(tài)代理類(lèi),作用類(lèi)似于上例中的ProxySubject,其中主要包含以下內(nèi)容:
Protected Proxy(InvocationHandler h):構(gòu)造函數(shù),估計(jì)用于給內(nèi)部的h賦值。
Static Class getProxyClass (ClassLoader loader, Class[] interfaces):獲得一個(gè)代理類(lèi),其中l(wèi)oader是類(lèi)裝載器,interfaces是真實(shí)類(lèi)所擁有的全部接口的數(shù)組。
Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理類(lèi)的一個(gè)實(shí)例,返回后的代理類(lèi)可以當(dāng)作被代理類(lèi)使用(可使用被代理類(lèi)的在Subject接口中聲明過(guò)的方法)。
所謂Dynamic Proxy是這樣一種class:它是在運(yùn)行時(shí)生成的class,在生成它時(shí)你必須提供一組interface給它,然后該class就宣稱(chēng)它實(shí)現(xiàn)了這些interface。你當(dāng)然可以把該class的實(shí)例當(dāng)作這些interface中的任何一個(gè)來(lái)用。當(dāng)然啦,這個(gè)Dynamic Proxy其實(shí)就是一個(gè)Proxy,它不會(huì)替你作實(shí)質(zhì)性的工作,在生成它的實(shí)例時(shí)你必須提供一個(gè)handler,由它接管實(shí)際的工作。(參見(jiàn)文獻(xiàn)3)
在使用動(dòng)態(tài)代理類(lèi)時(shí),我們必須實(shí)現(xiàn)InvocationHandler接口,以第一節(jié)中的示例為例:
代碼: //抽象角色(之前是抽象類(lèi),此處應(yīng)改為接口):
public interface Subject{
public void request();
}
//具體角色RealSubject:實(shí)現(xiàn)了Subject接口的request()方法。
public class RealSubject implements Subject{
public RealSubject(){
}
public void request(){
System.out.println("From real subject.");
}
}
//代理角色:
import java.lang.reflect.Method;
import java.lang.reflect.InvocationHandler;
public class DynamicSubject implements InvocationHandler{
private Object sub;
public DynamicSubject(Object sub){
this.sub = sub;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before calling " + method);
method.invoke(sub,args);
System.out.println("after calling " + method);
return null;
}
}
該代理類(lèi)的內(nèi)部屬性為Object類(lèi),實(shí)際使用時(shí)通過(guò)該類(lèi)的構(gòu)造函數(shù)DynamicSubject(Object sub)對(duì)其賦值;此外,在該類(lèi)還實(shí)現(xiàn)了invoke方法,該方法中的"method.invoke(sub,args)" 其實(shí)就是調(diào)用被代理對(duì)象的將要被執(zhí)行的方法,方法參數(shù)sub是實(shí)際的被代理對(duì)象,args為執(zhí)行被代理對(duì)象相應(yīng)操作所需的參數(shù)。通過(guò)動(dòng)態(tài)代理類(lèi),我們可以在調(diào)用之前或之后執(zhí)行一些相關(guān)操作。
客戶端:
代碼: import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Client{
static public void main(String[] args) throws Throwable{
RealSubject rs = new RealSubject(); //在這里指定被代理類(lèi)
InvocationHandler ds = new DynamicSubject(rs); //初始化代理類(lèi)
Class cls = rs.getClass();
//以下是分解步驟
/*
Class c = Proxy.getProxyClass(cls.getClassLoader(),cls.getInterfaces());
Constructor ct=c.getConstructor(new Class[]{InvocationHandler.class});
Subject subject =(Subject) ct.newInstance(new Object[]{ds});
*/
//以下是一次性生成
Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),ds);
subject.request();
}
通過(guò)這種方式,被代理的對(duì)象(RealSubject)可以在運(yùn)行時(shí)動(dòng)態(tài)改變,需要控制的接口(Subject接口)可以在運(yùn)行時(shí)改變,控制的方式(DynamicSubject類(lèi))也可以動(dòng)態(tài)改變,從而實(shí)現(xiàn)了非常靈活的動(dòng)態(tài)代理關(guān)系。
3.代理模式使用原因和應(yīng)用方面
(1)授權(quán)機(jī)制 不同級(jí)別的用戶對(duì)同一對(duì)象擁有不同的訪問(wèn)權(quán)利,如Jive論壇系統(tǒng)中,就使用Proxy進(jìn)行授權(quán)機(jī)制控制,訪問(wèn)論壇有兩種人:注冊(cè)用戶和游客(未注冊(cè)用戶),Jive中就通過(guò)類(lèi)似ForumProxy這樣的代理來(lái)控制這兩種用戶對(duì)論壇的訪問(wèn)權(quán)限.
(2)某個(gè)客戶端不能直接操作到某個(gè)對(duì)象,但又必須和那個(gè)對(duì)象有所互動(dòng).
舉例兩個(gè)具體情況:
如果那個(gè)對(duì)象是一個(gè)是很大的圖片,需要花費(fèi)很長(zhǎng)時(shí)間才能顯示出來(lái),那么當(dāng)這個(gè)圖片包含在文檔中時(shí),使用編輯器或?yàn)g覽器打開(kāi)這個(gè)文檔,打開(kāi)文檔必須很迅速,不能等待大圖片處理完成,這時(shí)需要做個(gè)圖片Proxy來(lái)代替真正的圖片.
如果那個(gè)對(duì)象在Internet的某個(gè)遠(yuǎn)端服務(wù)器上,直接操作這個(gè)對(duì)象因?yàn)榫W(wǎng)絡(luò)速度原因可能比較慢,那我們可以先用Proxy來(lái)代替那個(gè)對(duì)象.
總之原則是,對(duì)于開(kāi)銷(xiāo)很大的對(duì)象,只有在使用它時(shí)才創(chuàng)建,這個(gè)原則可以為我們節(jié)省很多寶貴的Java內(nèi)存. 所以,有些人認(rèn)為Java耗費(fèi)資源內(nèi)存,我以為這和程序編制思路也有一定的關(guān)系.
(3)現(xiàn)實(shí)中,Proxy應(yīng)用范圍很廣,現(xiàn)在流行的分布計(jì)算方式RMI和Corba等都是Proxy模式的應(yīng)用
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/goodHabit/archive/2009/11/08/4784461.aspx
JAVA反射機(jī)制一、Win鍵相關(guān)的快捷鍵
鍵位
Win
Win
Win
Shift
Win
Win
Shift
Win
Shift
Ctrl
Alt
Ctrl
WIN
Win
Win
Win
Win
Win
Win
Win
Win
Win
Win
Win
Win
Win
Win
二、Windows基礎(chǔ)快捷鍵
鍵位
F1
Ctrl+C
Ctrl+X
Ctrl+V
Ctrl+Z
Ctrl+Y
Delete
Shift+Delete
F2
Ctrl+A
F3
Alt+Enter
Alt+F4
Alt+空格
Alt+Tab
Ctrl+Alt+Tab
Ctrl+滾輪
Ctrl+
Alt+Esc
F4
Shift+F10
Ctrl+Esc
F10
F5
Alt+
Esc
Ctrl+Shift+Esc
插入碟片時(shí)按住Shift
右邊或左邊的
三、資源管理器相關(guān)快捷鍵
鍵位
Ctrl
Ctrl
Ctrl
End
Home
F11
Ctrl
Ctrl
Num
Num