亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

設計模式之代理模式

2019-11-09 14:35:40
字體:
來源:轉載
供稿:網友

代理模式在我們生活中是十分常見的,例如,幫我打包午飯,幫我拿一下快遞,這些是我們日常的代理模式。其中你是委托人,代理人是你朋友,而事件就是打包午飯、拿快遞。

簡介

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

模式中的角色與職責

Subject: 抽象主題類   該類的主要職責是申明真是主題與代理的共同接口方法,該類既可以是個抽象類也可以是個接口(具有抽象方法)。    RealSubject: 真實主題類   該類也稱為委托類或者被代理類,該類定義了代理所表示的真是對象(也就是實現了抽象方法),由其執行具體的業務邏輯。    ProxySubject:代理類   這個類的對象持有一個對真實主題的引用,在這個類所實現的接口方法中調用真實主題類中相應的方法執行,這樣就實現了代理的目的。    Client:客戶類   也就是使用代理類的類型,客戶類通過代理類間接地調用了真實主題類中定義的方法。

代理模式可以分為靜態代理和動態代理。

靜態代理

具體實現代碼如下:

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(); }}

通過示例代碼相信大家對靜態代理有了一定的理解。 1.委托人和代理人都可以完成同樣一件事。(實現同一個接口) 2.委托人告訴代理人去完成這件事,代理人才去做這件事。(代理人需要持有委托人引用)

動態代理

同樣是帶午飯的場景,但是自己寫代碼寫到忘記了時間,一抬頭發現同事都走光了,那么誰能幫自己帶個飯呢?在等待的過程中是誰先出現,張三還是李四?(程序需要動態創建一個對象)而且最重要的是出現的那個同事要能幫自己帶飯才行(上步創建的對象需要實現Subject接口)

public class JavaDemo { public static void main(String[] args) { final Subject realSubject = new RealSubject(); //第一個參數,目標的裝載器 //第二個參數,目標接口,為每個接口生成代理 //第三個參數,實現了InvocationHandler接口,當你一調用代理,代理就會調用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 //調用目標方法 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相當于一個處理器,在invoke方法中我們能夠操作真實對象,可以附加其他操作。而我們通過Proxy.newProxyInstance(..)方法生成代理。實現InvocationHandler接口并附加操作后,獲取代理角色。

動態代理的重點在于Proxy.newProxyInstance(),有興趣的同學可以看看里面的實現源碼。主要步驟是: 1.ProxyGenerator.generateProxyClass方法負責生成代理類的字節碼,生成邏輯比較復雜,有興趣的同學可以繼續分析源碼 sun.misc.ProxyGenerator; 2.native方法Proxy.defineClass0負責字節碼加載的實現,并返回對應的Class對象。 3.利用clazz.newInstance反射機制生成代理類的對象;

而動態代理是相當強大的,下面我們自己看一下Retrofit的動態代理例子:

Retrofit是現在最火的Android網絡請求框架之一,相信大家或多或少都有了解過。我們看一下Retrofit怎么使用動態代理模式的。

1.創建一個請求方法的接口:

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

2.生成Retrofit對象,并且創建一個實現了GitHubServiece接口的實體類:

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

上面的大家用過Retrofit都會很熟悉,我們看一下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); } }); }

經過上面對動態代理的理解,對create()封裝的代碼,一看就非常清楚,就是動態代理模式嘛。


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

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

攔截、擴展:代理類在實現接口方法的時候,除了調用委托類方法外,還可以在不修改委托類的情況下,增加一些其他需求功能。如我們試想在實現類滿足要求時,我們可以直接使用實現類,但是實現類再滿足不了需求的時候,我們就得擴展,但是根據開閉原則,我們不能直接修改實現類的代碼,這樣我們可以通過代理類可擴展功能;另外就是我們權限分配,我們可以根據對申請權限的對象進行攔截,根據不同的角色條件做判斷,然后再分配對用的權限。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品电影在线观看| 性欧美暴力猛交69hd| 91国在线精品国内播放| 成人精品一区二区三区| 日韩视频免费大全中文字幕| 欧美第一黄色网| 国产精品亚洲自拍| 国产91在线播放| 国产精品黄色影片导航在线观看| 成人免费看黄网站| 欧美一区二区三区图| 亚洲第一偷拍网| 亚洲激情视频在线播放| 亚洲a∨日韩av高清在线观看| 日韩在线免费观看视频| 这里只有精品在线观看| 中文字幕亚洲无线码在线一区| 欧美性xxxx极品高清hd直播| 国产精品视频网| 久久久天堂国产精品女人| 亚洲成色777777在线观看影院| 国产91免费观看| 国产精品91免费在线| 色综合91久久精品中文字幕| 成人黄色免费看| 欧美激情精品久久久久久| 午夜精品蜜臀一区二区三区免费| 久久韩国免费视频| 亚洲欧美另类中文字幕| 日韩欧美有码在线| 午夜精品一区二区三区在线播放| 全球成人中文在线| 欧美日韩精品中文字幕| 色综合导航网站| 国产精品久久久久久久久久久不卡| 久久99精品视频一区97| 国产一区二区三区日韩欧美| 精品亚洲男同gayvideo网站| 日本人成精品视频在线| 97在线免费观看视频| 亚洲伊人久久大香线蕉av| 欧洲亚洲女同hd| 亚洲精品久久久久中文字幕二区| 欧美国产精品日韩| 成人写真视频福利网| 国产性猛交xxxx免费看久久| 亚洲免费精彩视频| 欧美在线观看www| 亚洲成人激情在线观看| 日韩av日韩在线观看| 亚洲娇小xxxx欧美娇小| 久久精彩免费视频| 亚洲国产另类久久精品| 26uuu另类亚洲欧美日本一| 久久99久久亚洲国产| 亚洲一区二区中文字幕| 成人免费看片视频| 亚洲第一中文字幕| 亚洲国内高清视频| 亚洲精品一区中文| 在线日韩欧美视频| 中文欧美在线视频| 在线观看国产精品日韩av| 在线看片第一页欧美| 国产99在线|中文| 欧美激情国产日韩精品一区18| 国产成人一区二| 中文字幕综合在线| 久久精品一偷一偷国产| 亚洲午夜色婷婷在线| 亚洲乱码国产乱码精品精天堂| 欧美大尺度电影在线观看| 91精品视频免费观看| 黑人巨大精品欧美一区免费视频| 在线成人免费网站| 日韩网站在线观看| 亚洲男女自偷自拍图片另类| 中文字幕亚洲在线| 久久精品色欧美aⅴ一区二区| 成人国产精品色哟哟| 亚洲伊人一本大道中文字幕| 国产精品欧美激情在线播放| 久久久影视精品| 日韩精品在线观看视频| 国产精品久久久久av| 国产精品免费久久久| 国产日韩在线观看av| 亚洲第一区第一页| 中文字幕综合在线| 精品国产乱码久久久久久虫虫漫画| 日韩中文字幕免费看| 不卡毛片在线看| 国产欧美久久久久久| 成人免费在线视频网址| 成人免费在线网址| 欧美xxxx综合视频| 4k岛国日韩精品**专区| 久久久久久久久国产精品| 亚洲成色777777女色窝| 久久久久中文字幕| 97热精品视频官网| 欧美激情一区二区久久久| 国产精品久久久av| 久久久久久久久久久国产| 国产v综合ⅴ日韩v欧美大片| 色青青草原桃花久久综合| 九九综合九九综合| 国产成人精品视| 亚洲精品国产品国语在线| 中文字幕亚洲综合久久筱田步美| 欧美电影免费在线观看| 亚洲无av在线中文字幕| 中文字幕欧美精品在线| 精品中文字幕在线观看| 欧美性videos高清精品| 欧美成人一区在线| 欧美一区二区三区免费观看| 91产国在线观看动作片喷水| 亚洲自拍av在线| 亚洲欧美国产va在线影院| 亚洲精品视频免费在线观看| 日韩av男人的天堂| 97av在线播放| 欧美日韩国产精品一区二区不卡中文| 国产一区二区丝袜高跟鞋图片| 亚洲男人的天堂在线播放| www国产亚洲精品久久网站| 久久成人一区二区| 亚洲欧美在线x视频| 日韩精品免费在线视频| 精品毛片三在线观看| 在线视频亚洲欧美| 亚洲综合一区二区不卡| 久久久女女女女999久久| 亚洲人成电影在线| 91精品在线一区| 成人福利网站在线观看| 日韩美女在线看| 92版电视剧仙鹤神针在线观看| 国产精品激情av在线播放| 亚洲精品一区中文| 久久香蕉国产线看观看av| 国产精品第8页| 97久久超碰福利国产精品…| 久久久精品国产亚洲| 欧美影院成年免费版| 欧美性xxxx| 夜夜嗨av色综合久久久综合网| 久久精品中文字幕免费mv| 亚洲精品自拍第一页| 性欧美激情精品| 国产精品日韩在线观看| 国模吧一区二区三区| 一区二区三区日韩在线| 欧美福利视频网站| 欧美另类xxx| 久久久久久久久久av| 777午夜精品福利在线观看| 精品国产一区二区三区久久| 国产亚洲精品激情久久| 亚洲香蕉av在线一区二区三区| 色综合久久久久久中文网| 亚洲香蕉伊综合在人在线视看| 亚洲男人天堂手机在线|