摘要:而在模式中角色與角色的接口是相同的透明性。而在模式中與增加新功能相比它更注重通過設(shè)置代理人的方式來減輕本人的工作負(fù)擔(dān)
本文首發(fā)于泊浮目的專欄:https://segmentfault.com/blog...前言
代理模式是在編程中非常常見的設(shè)計模式.筆者在面試的過程中也經(jīng)常會問到相關(guān)的問題,但是很多同學(xué)答的并不盡人意.在這篇文章中,筆者想和大家聊聊代理模式的應(yīng)用及一些實踐.
What先來一張圖
我們可以很明顯的看到,代理和客戶端發(fā)生了耦合,而目標(biāo)端則與客戶端解耦.
Why上文提到了一點,松耦合.而在任何設(shè)計模式中,他們的目的都在以下范圍內(nèi):
減少代碼冗余度,提高代碼復(fù)用性
松耦合
這里提到了代碼的復(fù)用性,也可以多嘴一句,代理模式可以幫助我們實現(xiàn)The Open Closed Principle.
在這里,我們可以舉一個例子.Target可能是一位不錯的程序員,client是一家公司.在整個招聘流程中,如果Proxy是獵頭,有些獵頭則可能會想辦法幫程序員提高身價.而如果Proxy是Hr,則可能會來殺殺價.而程序員走的流程可能一直是一樣的:
電面
到面
簽合同
我們可以把不同的行為(討價還價的特殊技巧)寫在不同的Proxy里(HrProxy or 獵頭Proxy),而我們的程序員只要專心走流程就行了.
How以Java中最常用的框架——Spring為例.Spring最主要提供了2個功能:
IOC(Inversion of Control)
AOP(Aspect Oriented Programming)
而我們知道,Spring的AOP本質(zhì)上是通過代理模式來做的.接下來我們來詳細(xì)聊聊Spring提供的4種類型的AOP支持:
基于代理的經(jīng)典Spring AOP;
純POJO切面;
@AspectJ注解驅(qū)動的切面;
注入式AspectJ切面(適用于Spring各版本)。
前三種都是Spring AOP實現(xiàn)的變體,Spring AOP構(gòu)建在動態(tài)代理基礎(chǔ)之上,因此,Spring對AOP的支持局限于方法攔截。
而SpringAOP支持兩種模式的動態(tài)代理,JDK Proxy和cglib.當(dāng)Spring發(fā)現(xiàn)目標(biāo)被代理類實現(xiàn)就接口時,則用JDK Proxy來實現(xiàn).
JDK Proxy不完全通過反射來做,也有ASM進(jìn)行字節(jié)碼操作的.本質(zhì)是通過接口約定來做的
cglib完全通過ASM字節(jié)碼來做.本質(zhì)通過繼承的方式實現(xiàn)
代碼大概長這樣:
//spring aop 生成的代理 public class SpringAopTargetProxy extends Target{ public void operate(){ //spring aop method1... super.operate(); //spring aop method2... } }
而AspectJ是通過編譯時編織來做的,即在編譯時插代碼進(jìn)去.所以可以認(rèn)為它基于靜態(tài)代理來做AOP.
基于以上,我們也可以推導(dǎo)出SpringAOP對于finalorstatic方法是無效的.
call和execution有什么區(qū)別呢?
call就是在調(diào)用這個方法的地方插入代碼
execution就是在調(diào)用這個方法的前面插入代碼
代理模式的變化形式之前,我們根據(jù)代理生成的時機(jī)來區(qū)分了靜態(tài)代理和動態(tài)代理.而根據(jù)使用方式,常見則有兩類:
Virtual Proxy:只有當(dāng)真正需要實例時,它才生成和初始化實例
Remote Proxy:遠(yuǎn)程代理可以讓我們不必關(guān)心RealSubject角色是否在網(wǎng)絡(luò)上,而是像調(diào)本地方法一樣調(diào)用它的方法.Java的RMI(Remote Method Invocation)就相當(dāng)于遠(yuǎn)程代理.
類似的設(shè)計模式 AdapterAdapter模式適配了兩種具有不同接口(API)的對象,以使它們可以一同工作。而在Proxy模式中, Proxy角色與RealSubject角色的接口(API )是相同的(透明性)。
DecoratorDecorator模式與Proxy模式在實現(xiàn)上很相似(比如API的一致性),不過它們的使用目的不同——Decorator模式的目的在于增加新的功能。而在Proxy模式中,與增加新功能相比,它更注重通過設(shè)置代理人的方式來減輕本人的工作負(fù)擔(dān).
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/74343.html
摘要:均衡負(fù)載多臺服務(wù)器執(zhí)行程序,將大量請求分?jǐn)偨o多臺服務(wù)器無論如何,一臺服務(wù)器的進(jìn)程是有限的,我們不可能無限制的把一臺服務(wù)器的加到個,把內(nèi)存加到,則是不可能的。 在生產(chǎn)環(huán)境中,一個網(wǎng)站或服務(wù)端應(yīng)用出現(xiàn)響應(yīng)遲緩的時候,就應(yīng)該考慮是否由于用戶量太多,導(dǎo)致服務(wù)器難以處理的情況,并應(yīng)該考慮花錢來解決這個問題。當(dāng)然,這里首先會想到廉價的解決方式,比如通過調(diào)整服務(wù)器配置,優(yōu)化代碼性能等,但這些方式技術(shù)...
閱讀 1986·2021-11-25 09:43
閱讀 3763·2021-11-24 10:32
閱讀 1269·2021-10-13 09:39
閱讀 2449·2021-09-10 11:24
閱讀 3424·2021-07-25 21:37
閱讀 3547·2019-08-30 15:56
閱讀 931·2019-08-30 15:44
閱讀 1518·2019-08-30 13:18