成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

漫談代理模式

neuSnail / 3042人閱讀

摘要:而在模式中角色與角色的接口是相同的透明性。而在模式中與增加新功能相比它更注重通過(guò)設(shè)置代理人的方式來(lái)減輕本人的工作負(fù)擔(dān)

本文首發(fā)于泊浮目的專欄:https://segmentfault.com/blog...
前言

代理模式是在編程中非常常見的設(shè)計(jì)模式.筆者在面試的過(guò)程中也經(jīng)常會(huì)問(wèn)到相關(guān)的問(wèn)題,但是很多同學(xué)答的并不盡人意.在這篇文章中,筆者想和大家聊聊代理模式的應(yīng)用及一些實(shí)踐.

What

先來(lái)一張圖

我們可以很明顯的看到,代理和客戶端發(fā)生了耦合,而目標(biāo)端則與客戶端解耦.

Why

上文提到了一點(diǎn),松耦合.而在任何設(shè)計(jì)模式中,他們的目的都在以下范圍內(nèi):

減少代碼冗余度,提高代碼復(fù)用性

松耦合

這里提到了代碼的復(fù)用性,也可以多嘴一句,代理模式可以幫助我們實(shí)現(xiàn)The Open Closed Principle.

在這里,我們可以舉一個(gè)例子.Target可能是一位不錯(cuò)的程序員,client是一家公司.在整個(gè)招聘流程中,如果Proxy是獵頭,有些獵頭則可能會(huì)想辦法幫程序員提高身價(jià).而如果Proxy是Hr,則可能會(huì)來(lái)殺殺價(jià).而程序員走的流程可能一直是一樣的:

電面

到面

簽合同

我們可以把不同的行為(討價(jià)還價(jià)的特殊技巧)寫在不同的Proxy里(HrProxy or 獵頭Proxy),而我們的程序員只要專心走流程就行了.

How

以Java中最常用的框架——Spring為例.Spring最主要提供了2個(gè)功能:

IOC(Inversion of Control)

AOP(Aspect Oriented Programming)

而我們知道,Spring的AOP本質(zhì)上是通過(guò)代理模式來(lái)做的.接下來(lái)我們來(lái)詳細(xì)聊聊Spring提供的4種類型的AOP支持:

基于代理的經(jīng)典Spring AOP;

純POJO切面;

@AspectJ注解驅(qū)動(dòng)的切面;

注入式AspectJ切面(適用于Spring各版本)。

前三種都是Spring AOP實(shí)現(xiàn)的變體,Spring AOP構(gòu)建在動(dòng)態(tài)代理基礎(chǔ)之上,因此,Spring對(duì)AOP的支持局限于方法攔截。

而SpringAOP支持兩種模式的動(dòng)態(tài)代理,JDK Proxy和cglib.當(dāng)Spring發(fā)現(xiàn)目標(biāo)被代理類實(shí)現(xiàn)就接口時(shí),則用JDK Proxy來(lái)實(shí)現(xiàn).

JDK Proxy不完全通過(guò)反射來(lái)做,也有ASM進(jìn)行字節(jié)碼操作的.本質(zhì)是通過(guò)接口約定來(lái)做的

cglib完全通過(guò)ASM字節(jié)碼來(lái)做.本質(zhì)通過(guò)繼承的方式實(shí)現(xiàn)

代碼大概長(zhǎng)這樣:

//spring aop 生成的代理
public class SpringAopTargetProxy extends Target{
    public void  operate(){
            //spring aop method1...
            super.operate();
           //spring aop method2...
    }
}

而AspectJ是通過(guò)編譯時(shí)編織來(lái)做的,即在編譯時(shí)插代碼進(jìn)去.所以可以認(rèn)為它基于靜態(tài)代理來(lái)做AOP.

基于以上,我們也可以推導(dǎo)出SpringAOP對(duì)于finalorstatic方法是無(wú)效的.

callexecution有什么區(qū)別呢?

call就是在調(diào)用這個(gè)方法的地方插入代碼

execution就是在調(diào)用這個(gè)方法的前面插入代碼

代理模式的變化形式

之前,我們根據(jù)代理生成的時(shí)機(jī)來(lái)區(qū)分了靜態(tài)代理和動(dòng)態(tài)代理.而根據(jù)使用方式,常見則有兩類:

Virtual Proxy:只有當(dāng)真正需要實(shí)例時(shí),它才生成和初始化實(shí)例

Remote Proxy:遠(yuǎn)程代理可以讓我們不必關(guān)心RealSubject角色是否在網(wǎng)絡(luò)上,而是像調(diào)本地方法一樣調(diào)用它的方法.Java的RMI(Remote Method Invocation)就相當(dāng)于遠(yuǎn)程代理.

類似的設(shè)計(jì)模式 Adapter

Adapter模式適配了兩種具有不同接口(API)的對(duì)象,以使它們可以一同工作。而在Proxy模式中, Proxy角色與RealSubject角色的接口(API )是相同的(透明性)。

Decorator

Decorator模式與Proxy模式在實(shí)現(xiàn)上很相似(比如API的一致性),不過(guò)它們的使用目的不同——Decorator模式的目的在于增加新的功能。而在Proxy模式中,與增加新功能相比,它更注重通過(guò)設(shè)置代理人的方式來(lái)減輕本人的工作負(fù)擔(dān).

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74343.html

相關(guān)文章

  • 漫談Web緩存

    摘要:了解前端緩存是打造高性能網(wǎng)站的必要知識(shí)。這個(gè)表示,你的請(qǐng)求發(fā)送到后端,后端判斷并認(rèn)為資源可以繼續(xù)使用,直接使用本地緩存。盡可能的設(shè)置久緩存時(shí)間,通過(guò)碼來(lái)管理版本。參考鏈接淺談緩存權(quán)威指南上配置緩存首發(fā)地址 背景說(shuō)明 緩存一直是前端性能優(yōu)化中,濃墨重彩的一筆。了解前端緩存是打造高性能網(wǎng)站的必要知識(shí)。 之前,對(duì)于緩存的認(rèn)知一直停留在看《HTTP權(quán)威指南》和一些相關(guān)帖子的深度,過(guò)了一段時(shí)...

    davidac 評(píng)論0 收藏0
  • 漫談Web緩存

    摘要:了解前端緩存是打造高性能網(wǎng)站的必要知識(shí)。這個(gè)表示,你的請(qǐng)求發(fā)送到后端,后端判斷并認(rèn)為資源可以繼續(xù)使用,直接使用本地緩存。盡可能的設(shè)置久緩存時(shí)間,通過(guò)碼來(lái)管理版本。參考鏈接淺談緩存權(quán)威指南上配置緩存首發(fā)地址 背景說(shuō)明 緩存一直是前端性能優(yōu)化中,濃墨重彩的一筆。了解前端緩存是打造高性能網(wǎng)站的必要知識(shí)。 之前,對(duì)于緩存的認(rèn)知一直停留在看《HTTP權(quán)威指南》和一些相關(guān)帖子的深度,過(guò)了一段時(shí)...

    Carl 評(píng)論0 收藏0
  • 漫談Web緩存

    摘要:了解前端緩存是打造高性能網(wǎng)站的必要知識(shí)。這個(gè)表示,你的請(qǐng)求發(fā)送到后端,后端判斷并認(rèn)為資源可以繼續(xù)使用,直接使用本地緩存。盡可能的設(shè)置久緩存時(shí)間,通過(guò)碼來(lái)管理版本。參考鏈接淺談緩存權(quán)威指南上配置緩存首發(fā)地址 背景說(shuō)明 緩存一直是前端性能優(yōu)化中,濃墨重彩的一筆。了解前端緩存是打造高性能網(wǎng)站的必要知識(shí)。 之前,對(duì)于緩存的認(rèn)知一直停留在看《HTTP權(quán)威指南》和一些相關(guān)帖子的深度,過(guò)了一段時(shí)...

    shuibo 評(píng)論0 收藏0
  • 如何應(yīng)對(duì)服務(wù)器壓力?服務(wù)器橫向擴(kuò)展(加機(jī)器)策略漫談

    摘要:均衡負(fù)載多臺(tái)服務(wù)器執(zhí)行程序,將大量請(qǐng)求分?jǐn)偨o多臺(tái)服務(wù)器無(wú)論如何,一臺(tái)服務(wù)器的進(jìn)程是有限的,我們不可能無(wú)限制的把一臺(tái)服務(wù)器的加到個(gè),把內(nèi)存加到,則是不可能的。 在生產(chǎn)環(huán)境中,一個(gè)網(wǎng)站或服務(wù)端應(yīng)用出現(xiàn)響應(yīng)遲緩的時(shí)候,就應(yīng)該考慮是否由于用戶量太多,導(dǎo)致服務(wù)器難以處理的情況,并應(yīng)該考慮花錢來(lái)解決這個(gè)問(wèn)題。當(dāng)然,這里首先會(huì)想到廉價(jià)的解決方式,比如通過(guò)調(diào)整服務(wù)器配置,優(yōu)化代碼性能等,但這些方式技術(shù)...

    he_xd 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<