蘇州培訓(xùn)網(wǎng) > 蘇州JAVA培訓(xùn)機(jī)構(gòu) > 蘇州其然軟件開發(fā)培訓(xùn)
首頁 培訓(xùn)網(wǎng) 最新資訊 熱門問答

蘇州其然軟件開發(fā)培訓(xùn)

免費(fèi)試聽

您當(dāng)前的位置: 蘇州IT認(rèn)證培訓(xùn) > 蘇州JAVA培訓(xùn) > 張家港專業(yè)java培訓(xùn)課程

張家港專業(yè)java培訓(xùn)課程_JAVA培訓(xùn)

¥詳詢

班制:周末班

蘇州其然軟件開發(fā)
上課(咨詢)地址:蘇州市昆山市震川西路111號(hào)名仕大廈
報(bào)名咨詢 預(yù)約試聽
課程介紹
張家港專業(yè)java培訓(xùn)課程
其然IT 教育師資

張家港專業(yè)java培訓(xùn)課程

張家港專業(yè)java培訓(xùn)課程

Java開發(fā)的應(yīng)該 如何掌握上述相關(guān)技術(shù)?

張家港專業(yè)java培訓(xùn)課程

Java開發(fā)的應(yīng)該如何掌握上述相關(guān)技術(shù)?

一:首先,有這樣的一種情況很常見,對(duì)于想自學(xué)Java開發(fā)的人來說,他們 大多數(shù)都是非常盲目的,不知道自己改如何入手,很多人在網(wǎng)上找一些視頻,然后瘋狂的過視頻,很快就把一塊內(nèi)容都學(xué)完,他們理解的學(xué)完了就是視 頻看完了,但是讓他們動(dòng)手去做東西卻做不出來,而我的理解學(xué)完了就是自己能寫出東西,所以對(duì)于初學(xué)者來說一定不能盲目,要有自己的規(guī)劃,不然 就是浪費(fèi)時(shí)間白忙活。

二:既然是學(xué)習(xí)Java開發(fā)專業(yè)技術(shù),我個(gè)人的建議是,一定要有一個(gè)能指導(dǎo) 你的人,不能都靠自己閉門造車,這樣的行為并不聰明,結(jié)識(shí)一位這方面的人才,時(shí)不時(shí)去問問人家問題,不然你可能會(huì)發(fā)現(xiàn)一個(gè)小問題能困擾你一天 ,**后還不知道是什么原因。

三:學(xué)習(xí)Java開發(fā)技術(shù),不能跟學(xué)數(shù)學(xué)語文一樣對(duì)待,比較剛接觸代碼是不 容易記住的,所以要掌握上述的技術(shù),你還要知道學(xué)習(xí)Java開發(fā)技術(shù)有哪些“坑”。對(duì)于學(xué)習(xí)方法這塊是尤為重要的,怎么學(xué)才能讓你學(xué)完了能記住之 前學(xué)的那些,不至于學(xué)完了就忘,這個(gè)問題值得你學(xué)習(xí)之前去思考的。

四:根據(jù)我多年的學(xué)習(xí)情況來看,你平時(shí)一定要養(yǎng)成好的學(xué)習(xí)習(xí)慣,就說我 自己吧!我就喜歡把自己曾經(jīng)遇到的問題整理在電腦的日記本上,然后我會(huì)搜集一下博客相關(guān)的Java技術(shù)文章,一些我認(rèn)為比較有用的網(wǎng)站,以后都能 用的上,這是我個(gè)人的學(xué)習(xí)習(xí)慣,相信我,如果你想走的更遠(yuǎn),一定要養(yǎng)成習(xí)慣。

**后給大家一些詳細(xì)的學(xué)習(xí)安排路線:

Java基礎(chǔ):Java基礎(chǔ)語法、數(shù)組、類與對(duì)象、繼承與多態(tài)、異常、范型、集 合、流與文件、反射、枚舉、自動(dòng)裝箱和注解。

數(shù)據(jù)庫:mysql、oracle

Javaweb:HTML與CSS網(wǎng)頁開發(fā)基礎(chǔ)、Java腳本語言、搭建開發(fā)環(huán)境、JSP基 本語法、JSP內(nèi)置對(duì)象、JavaBean技術(shù)、Servlet技術(shù)、Ajax技術(shù)

框架:Struts2、Hibernate、Spring、SpringMVC、mybatis

java互聯(lián)網(wǎng)開發(fā)工程師


張家港專業(yè)java培訓(xùn)課程

設(shè)計(jì)模式之代理模式


>

代理模式在我們生活中是十分常見的,例如,幫我打包午飯,幫我拿一下快遞,這些是我們?nèi)粘5拇砟J?。其中你是委托人,代理人是你朋友,而事件就是打包午飯、拿快遞。

簡介

代理模式的定義:PRovide a surrogate or placeholder for another object to controlaccess to it(為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問)。

模式中的角色與職責(zé)

Subject: 抽象主題類   該類的主要職責(zé)是申明真是主題與代理的共同接口方法,該類既可以是個(gè)抽象類也可以是個(gè)接口(具有抽象方法)。 RealSubject: 真實(shí)主題類   該類也稱為委托類或者被代理類,該類定義了代理所表示的真是對(duì)象(也就是實(shí)現(xiàn)了抽象方法),由其執(zhí)行具體的業(yè)務(wù)邏輯。 ProxySubject:代理類   這個(gè)類的對(duì)象持有一個(gè)對(duì)真實(shí)主題的引用,在這個(gè)類所實(shí)現(xiàn)的接口方法中調(diào)用真實(shí)主題類中相應(yīng)的方法執(zhí)行,這樣就實(shí)現(xiàn)了代理的目的。 Client:客戶類   也就是使用代理類的類型,客戶類**代理類間接地調(diào)用了真實(shí)主題類中定義的方法。

代理模式可以分為靜態(tài)代理和動(dòng)態(tài)代理。

靜態(tài)代理

具體實(shí)現(xiàn)代碼如下:

public class javaDemo { public static void main(String[] args) { ProxySubject proxySubject = new ProxySubject(new RealSubject()); proxySubject.request(); } } interface Subject { abstract void request(); } class RealSubject implements Subject { @Override public void request() { // TODO Auto-generated method stub System.out.println("To do something."); } } class ProxySubject implements Subject { private RealSubject mRealSubject; public ProxySubject(RealSubject realSubject) { super(); // TODO Auto-generated constructor stub mRealSubject = realSubject; } @Override public void request() { // TODO Auto-generated method stub mRealSubject.request(); } }

**示例代碼相信大家對(duì)靜態(tài)代理有了一定的理解。 1.委托人和代理人都可以完成同樣一件事。(實(shí)現(xiàn)同一個(gè)接口) 2.委托人告訴代理人去完成這件事,代理人才去做這件事。(代理人需要持有委托人引用)

動(dòng)態(tài)代理

同樣是帶午飯的場景,但是自己寫代碼寫到忘記了時(shí)間,一抬頭發(fā)現(xiàn)同事都走光了,那么誰能幫自己帶個(gè)飯呢?在等待的過程中是誰先出現(xiàn),張三還是李四?(程序需要?jiǎng)討B(tài)創(chuàng)建一個(gè)對(duì)象)而且**重要的是出現(xiàn)的那個(gè)同事要能幫自己帶飯才行(上步創(chuàng)建的對(duì)象需要實(shí)現(xiàn)Subject接口)

public class JavaDemo { public static void main(String[] args) { final Subject realSubject = new RealSubject(); //**個(gè)參數(shù),目標(biāo)的裝載器 //第二個(gè)參數(shù),目標(biāo)接口,為每個(gè)接口生成代理 //第三個(gè)參數(shù),實(shí)現(xiàn)了InvocationHandler接口,當(dāng)你一調(diào)用代理,代理就會(huì)調(diào)用InvocationHandler的invoke方法 Subject subject = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub //調(diào)用目標(biāo)方法 return method.invoke(realSubject, args); } }); subject.request(); } } interface Subject { abstract void request(); } class RealSubject implements Subject { @Override public void request() { // TODO Auto-generated method stub System.out.println("To do something."); } }

InvocationHandler相當(dāng)于一個(gè)處理器,在invoke方法中我們能夠操作真實(shí)對(duì)象,可以附加其他操作。而我們**Proxy.newProxyInstance(..)方法生成代理。實(shí)現(xiàn)InvocationHandler接口并附加操作后,獲取代理角色。

動(dòng)態(tài)代理的重點(diǎn)在于Proxy.newProxyInstance(),有興趣的同學(xué)可以看看里面的實(shí)現(xiàn)源碼。主要步驟是: 1.ProxyGenerator.generateProxyClass方法負(fù)責(zé)生成代理類的字節(jié)碼,生成邏輯比較復(fù)雜,有興趣的同學(xué)可以繼續(xù)分析源碼 sun.misc.ProxyGenerator; 2.native方法Proxy.defineClass0負(fù)責(zé)字節(jié)碼加載的實(shí)現(xiàn),并返回對(duì)應(yīng)的Class對(duì)象。 3.利用clazz.newInstance反射機(jī)制生成代理類的對(duì)象;

而動(dòng)態(tài)代理是相當(dāng)強(qiáng)大的,下面我們自己看一下Retrofit的動(dòng)態(tài)代理例子:

Retrofit是現(xiàn)在**火的Android網(wǎng)絡(luò)請(qǐng)求框架之一,相信大家或多或少都有了解過。我們看一下Retrofit怎么使用動(dòng)態(tài)代理模式的。

1.創(chuàng)建一個(gè)請(qǐng)求方法的接口:

public interface HttpService { @FormUrlEncoded @POST(URLs.Login) Call<JSObject> login(@FieldMap() Map<String, String> maps); }

2.生成Retrofit對(duì)象,并且創(chuàng)建一個(gè)實(shí)現(xiàn)了GitHubServiece接口的實(shí)體類:

Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .build(); HttpService mHttpService = retrofit.create(HttpService.class);

上面的大家用過Retrofit都會(huì)很熟悉,我們看一下create()的代碼:

public <T> T create(final Class<T> service) { Utils.validateServiceInterface(service); if (validateEagerly) { eagerlyValidateMethods(service); } return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service }, new InvocationHandler() { private final Platform platform = Platform.get(); @Override public Object invoke(Object proxy, Method method, Object... args) throws Throwable { // If the method is a method from Object then defer to normal invocation. if (method.getDeclaringClass() == Object.class) { return method.invoke(this, args); } if (platform.isDefaultMethod(method)) { return platform.invokeDefaultMethod(method, service, proxy, args); } ServiceMethod serviceMethod = loadServiceMethod(method); OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args); return serviceMethod.callAdapter.adapt(okHttpCall); } }); }

經(jīng)過上面對(duì)動(dòng)態(tài)代理的理解,對(duì)create()封裝的代碼,一看就非常清楚,就是動(dòng)態(tài)代理模式嘛。


了解了靜態(tài)代理和動(dòng)態(tài)代理可能大家會(huì)想,在代碼層面上本來就可以自己完成,為什么要交給其他類完成呢?這樣不是多此一舉嗎?但在實(shí)際開發(fā)中,使用代理模式的作用有:

解耦:這是設(shè)計(jì)模式解決的基本問題。在這里委托類只需要做好自己的部分工作,然而一些額外的事情可以交給代理類完成。如自己準(zhǔn)備結(jié)婚,但是不可能自己去一手一腳去準(zhǔn)備整個(gè)婚禮,我們自己只需要請(qǐng)婚慶公司,定好價(jià)錢然后婚慶公司就能幫我們解決整場婚禮的大小事,我們自己不需要婚慶公司怎么完成,這樣是不是將我與結(jié)婚事件進(jìn)行了解耦。

攔截、擴(kuò)展:代理類在實(shí)現(xiàn)接口方法的時(shí)候,除了調(diào)用委托類方法外,還可以在不修改委托類的情況下,增加一些其他需求功能。如我們?cè)囅朐趯?shí)現(xiàn)類滿足要求時(shí),我們可以直接使用實(shí)現(xiàn)類,但是實(shí)現(xiàn)類再滿足不了需求的時(shí)候,我們就得擴(kuò)展,但是根據(jù)開閉原則,我們不能直接修改實(shí)現(xiàn)類的代碼,這樣我們可以**代理類可擴(kuò)展功能;另外就是我們權(quán)限分配,我們可以根據(jù)對(duì)申請(qǐng)權(quán)限的對(duì)象進(jìn)行攔截,根據(jù)不同的角色條件做判斷,然后再分配對(duì)用的權(quán)限。


相關(guān)推薦:


蘇州JAVA培訓(xùn)   蘇州JAVA培訓(xùn)班   蘇州JAVA培訓(xùn)機(jī)構(gòu)

體驗(yàn)課預(yù)約試聽

倒計(jì)時(shí)

12:00:00

課程熱線:

在線咨詢

客服在線時(shí)間:早上9點(diǎn)~下午6點(diǎn),其他時(shí)間請(qǐng)?jiān)诰€預(yù)約報(bào)名或留言,謝謝!

蘇州JAVA

免費(fèi)體驗(yàn)課開班倒計(jì)時(shí)

11: 41: 09

稍后會(huì)有專業(yè)老師給您回電,請(qǐng)保持電話暢通

咨詢電話:
推薦機(jī)構(gòu) 全國分站 更多課程

本周僅剩 個(gè)試聽名額

請(qǐng)鍵入信息,稍后系統(tǒng)將會(huì)把領(lǐng)獎(jiǎng)短信發(fā)至您的手機(jī)

申請(qǐng)?jiān)嚶犆~

QQ:
加盟合作:0755-83654572