日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2025/4/16 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【java设计模式】之 代理(Proxy)模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

代理模式的核心作用就是通過代理,控制對對象的訪問。這跟實際中是一樣的,比如說明星都有經紀人,這就是一個代理,比如有人要找某明星拍戲,那么首先處理這事的是他的經紀人,雖然拍戲需要自己拍,但是拍戲前后的一些必須要做的事等等,都由這個經紀人來處理。?
  在程序中也是如此,通過代理,可以詳細控制訪問某個或者某類對象的方法,在調用這個方法前做前置處理,調用這個方法后做后置處理。這也是AOP的實現原理。?
  那么代理模式的核心角色該如何設計呢?

設計思路:定義一個抽象角色,讓代理角色和真實角色分別去實現它。?
1. 真實角色:實現抽象角色,定義真實角色所要實現的業務邏輯,供代理角色調用它只關注真正的業務邏輯,比如拍戲。?
2. 代理角色:實現抽象角色,是真實角色的代理,通過真是角色的業務邏輯方法來實現抽象方法,并可以附加自己的操作,比如談合同,布置場地等等。

  下面來具體實現這個代理模式,代理模式分為靜態代理和動態代理。靜態代理是我們自己創建一個代理類,而動態代理是程序自動幫我們生成一個代理,我們就不用管了。

?

1. 靜態代理

?

根據上面的實現步驟,首先來寫一個抽象角色:

?

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

?

這個抽象類中有三個方法,現在分別讓真實角色和代理角色來實現該抽象類:

/*** @Description 真實對象* @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()");}}

唱歌部分,注明一下周杰倫,等會好區分。下面再來看下代理類。

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

在代理類中,可以看到,維護了一個Star對象,通過構造方法傳進來一個真實的Star對象給其賦值,然后在唱歌這個方法里,使用真實對象來唱歌。所以說面談、收錢都是由代理對象來實現的,唱歌是代理對象讓真實對象來做。?
下面寫個客戶端的測試用例:

?

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

?

輸出結果:

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

可以看出,客戶端只跟代理對象打交道,代理對象把能做的都做了,比如面談和收錢,唱歌呢,是調用真實對象去唱。

2. 動態代理

  動態代理比靜態代理使用的更廣泛,動態代理在本質上,代理類不用我們來管,我們完全交給工具去生成代理類。Star接口和RealStar實現類還是和上面的一樣,下面來定義一下代理類,使用動態代理需要實現InvocationHandler接口,并覆寫里面的invoke方法,如下:

/*** @Description 動態代理類* @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;// 在代理真實對象前,我們可以做些自己的操作System.out.println("面談");if(method.getName().equals("sing")) {object = method.invoke(realStar, args);}// 在代理真是對象后,我們可以做些自己的操作System.out.println("收錢");return object;}}

可以看出,思路和靜態代理是一樣的,先通過構造方法把真正的對象傳進來,然后執行代理的部分是invoke方法中,在該方法中,我們進行一次判斷,只有當需要唱歌的時候,我就調用剛剛傳進來的真實對象來唱,其他事情由代理代替真實對象來做,這里只用控制臺輸出來模擬一下。?
  最后來寫個客戶端測試一下:

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

看下控制臺輸出:

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

  由此可見,使用代理可以在執行某個邏輯的前后加上新的邏輯,這是很好的功能,實際中spring的AOP用的就是這種技術。?

?

?

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。