日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

【java设计模式】之 代理(Proxy)模式

發(fā)布時(shí)間:2025/4/16 asp.net 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【java设计模式】之 代理(Proxy)模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

代理模式的核心作用就是通過(guò)代理,控制對(duì)對(duì)象的訪問(wèn)。這跟實(shí)際中是一樣的,比如說(shuō)明星都有經(jīng)紀(jì)人,這就是一個(gè)代理,比如有人要找某明星拍戲,那么首先處理這事的是他的經(jīng)紀(jì)人,雖然拍戲需要自己拍,但是拍戲前后的一些必須要做的事等等,都由這個(gè)經(jīng)紀(jì)人來(lái)處理。?
  在程序中也是如此,通過(guò)代理,可以詳細(xì)控制訪問(wèn)某個(gè)或者某類(lèi)對(duì)象的方法,在調(diào)用這個(gè)方法前做前置處理,調(diào)用這個(gè)方法后做后置處理。這也是AOP的實(shí)現(xiàn)原理。?
  那么代理模式的核心角色該如何設(shè)計(jì)呢?

設(shè)計(jì)思路:定義一個(gè)抽象角色,讓代理角色和真實(shí)角色分別去實(shí)現(xiàn)它。?
1. 真實(shí)角色:實(shí)現(xiàn)抽象角色,定義真實(shí)角色所要實(shí)現(xiàn)的業(yè)務(wù)邏輯,供代理角色調(diào)用它只關(guān)注真正的業(yè)務(wù)邏輯,比如拍戲。?
2. 代理角色:實(shí)現(xiàn)抽象角色,是真實(shí)角色的代理,通過(guò)真是角色的業(yè)務(wù)邏輯方法來(lái)實(shí)現(xiàn)抽象方法,并可以附加自己的操作,比如談合同,布置場(chǎng)地等等。

  下面來(lái)具體實(shí)現(xiàn)這個(gè)代理模式,代理模式分為靜態(tài)代理和動(dòng)態(tài)代理。靜態(tài)代理是我們自己創(chuàng)建一個(gè)代理類(lèi),而動(dòng)態(tài)代理是程序自動(dòng)幫我們生成一個(gè)代理,我們就不用管了。

?

1. 靜態(tài)代理

?

根據(jù)上面的實(shí)現(xiàn)步驟,首先來(lái)寫(xiě)一個(gè)抽象角色:

?

/*** @Description 接口類(lèi)* @author shanheyongmu**/ public interface Star {public void confer(); //面談public void sing(); //唱歌public void collectMoney(); //收錢(qián) }

?

這個(gè)抽象類(lèi)中有三個(gè)方法,現(xiàn)在分別讓真實(shí)角色和代理角色來(lái)實(shí)現(xiàn)該抽象類(lèi):

/*** @Description 真實(shí)對(duì)象* @author shanheyongmu**/ public class RealStar implements Star {@Overridepublic void confer() {System.out.println("RealStar.confer()");}@Overridepublic void sing() {System.out.println("RealStar(周杰倫).sing()");}@Overridepublic void collectMoney() {System.out.println("RealStar.collectMoney()");}}

唱歌部分,注明一下周杰倫,等會(huì)好區(qū)分。下面再來(lái)看下代理類(lèi)。

/*** @Description 代理類(lèi)* @author shanheyongmu**/ public class ProxyStar implements Star {private Star star;public ProxyStar(Star star) { //到時(shí)候傳進(jìn)來(lái)真實(shí)的starsuper();this.star = star;}@Overridepublic void confer() {System.out.println("ProxyStar.confer()");}@Overridepublic void sing() {//其他事都能干,唯一不能干的就是唱歌,唱歌還是得要周杰倫本人來(lái)唱star.sing(); //讓他本人來(lái)唱 }@Overridepublic void collectMoney() {System.out.println("ProxyStar.collectMoney()");}}

在代理類(lèi)中,可以看到,維護(hù)了一個(gè)Star對(duì)象,通過(guò)構(gòu)造方法傳進(jìn)來(lái)一個(gè)真實(shí)的Star對(duì)象給其賦值,然后在唱歌這個(gè)方法里,使用真實(shí)對(duì)象來(lái)唱歌。所以說(shuō)面談、收錢(qián)都是由代理對(duì)象來(lái)實(shí)現(xiàn)的,唱歌是代理對(duì)象讓真實(shí)對(duì)象來(lái)做。?
下面寫(xiě)個(gè)客戶(hù)端的測(cè)試用例:

?

public class Client {public static void main(String[] args) {Star real = new RealStar();Star proxy = new ProxyStar(real);proxy.confer();proxy.sing();proxy.collectMoney();}}

?

輸出結(jié)果:

ProxyStar.confer()?
RealStar(周杰倫).sing()?
ProxyStar.collectMoney()

可以看出,客戶(hù)端只跟代理對(duì)象打交道,代理對(duì)象把能做的都做了,比如面談和收錢(qián),唱歌呢,是調(diào)用真實(shí)對(duì)象去唱。

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

  動(dòng)態(tài)代理比靜態(tài)代理使用的更廣泛,動(dòng)態(tài)代理在本質(zhì)上,代理類(lèi)不用我們來(lái)管,我們完全交給工具去生成代理類(lèi)。Star接口和RealStar實(shí)現(xiàn)類(lèi)還是和上面的一樣,下面來(lái)定義一下代理類(lèi),使用動(dòng)態(tài)代理需要實(shí)現(xiàn)InvocationHandler接口,并覆寫(xiě)里面的invoke方法,如下:

/*** @Description 動(dòng)態(tài)代理類(lèi)* @author shanheyongmu**/ public class StarHandler implements InvocationHandler {Star realStar;public StarHandler(Star realStar) {super();this.realStar = realStar;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Object object = null;// 在代理真實(shí)對(duì)象前,我們可以做些自己的操作System.out.println("面談");if(method.getName().equals("sing")) {object = method.invoke(realStar, args);}// 在代理真是對(duì)象后,我們可以做些自己的操作System.out.println("收錢(qián)");return object;}}

可以看出,思路和靜態(tài)代理是一樣的,先通過(guò)構(gòu)造方法把真正的對(duì)象傳進(jìn)來(lái),然后執(zhí)行代理的部分是invoke方法中,在該方法中,我們進(jìn)行一次判斷,只有當(dāng)需要唱歌的時(shí)候,我就調(diào)用剛剛傳進(jìn)來(lái)的真實(shí)對(duì)象來(lái)唱,其他事情由代理代替真實(shí)對(duì)象來(lái)做,這里只用控制臺(tái)輸出來(lái)模擬一下。?
  最后來(lái)寫(xiě)個(gè)客戶(hù)端測(cè)試一下:

public class Client {public static void main(String[] args) {Star realStar = new RealStar();StarHandler handler = new StarHandler(realStar);//創(chuàng)建代理類(lèi)Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler); proxy.sing();}}

看下控制臺(tái)輸出:

面談?
RealStar(周杰倫).sing()?
收錢(qián)

  由此可見(jiàn),使用代理可以在執(zhí)行某個(gè)邏輯的前后加上新的邏輯,這是很好的功能,實(shí)際中spring的AOP用的就是這種技術(shù)。?

?

?

總結(jié)

以上是生活随笔為你收集整理的【java设计模式】之 代理(Proxy)模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。