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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java设计模式(13)----------代理模式

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

原文:https://www.imooc.com/article/24850

默課道可工程師學習地址:https://www.imooc.com/article/24850

介紹

代理模式中,在客戶端與對象之間增加了一個代理層。客戶端在進行訪問時候,不是直接訪問對象,而是訪問代理。代理模式是一種結構型的設計模式。通過代理模式,可以解決直接訪問對象帶來的一些問題,并且可以進行訪問控制。

代理模式的實現中,代理類中依賴實體類,但兩者共同實現相同的接口。代理類中對應接口中,會調用實體類的對應接口。聽上去與裝飾器的實現一樣,是的,兩者的實現基本上是相同的,只是使用意義上的側重點不同。兩者的區別,會在文末的總結中進行分析。

代理模式的應用場景比較廣泛,跟“代理”兩個字沾邊的,一般都會涉及代理模式。比如火車票代售站,對于乘客來說,他不需要去真正的火車站,而通過代售點,就可以實現買票取票的功能。比如VPN,由于眾所周知的原因,我們不能訪問youtube,那么我們可以設置一個VPN,通過VPN進行訪問。再比如說windows的快捷方式,也是一種代理。還有就是Spring的AOP。

代理模式從類型上來說分為兩種,靜態代理和動態代理。所謂靜態代理,就是在編譯期間就確定的代理關系,一般是一對一的。而動態代理,是一對多的代理關系,是在運行時態才能確定的代理關系。動態代理的原理比較復雜,本篇文章只簡單介紹動態代理的使用,在下一篇文章中,會從原理和代碼的層面,對動態代理做專門的解讀。

案例

靜態代理

背景

以購買火車票為例。乘客(客戶端)在購買火車票的時候,可以在代售點(代理類)進行購買(功能),而不需要花費很長的時間跑去火車站(真實類)進行購買(功能)。

實現

定義抽象接口

public interface shop {void buy();void take(); }

定義真實火車站

public class Station implements shop {@Overridepublic void buy() {System.out.println("購買火車票");}@Overridepublic void take() {System.out.println("領取火車票");} }

定義代售點

public class ProxyStation implements shop {private Station station = new Station();@Overridepublic void buy() {beforeBuy();station.buy();afterBuy();}private void beforeBuy() {System.out.println("購買之前操作");}private void afterBuy() {System.out.println("購買之后的操作");}@Overridepublic void take() {beforeTake();station.take();afterTake();}private void afterTake() {System.out.println("取票之前的操作");}private void beforeTake() {System.out.println("取票之后的操作");} }

驗證程序

public class Test {public static void main(String args[]){ProxyStation proxyStation = new ProxyStation();proxyStation.buy();proxyStation.take();} }

運行結果

購買之前操作
購買火車票
購買之后的操作
取票之后的操作
領取火車票
取票之前的操作

Process finished with exit code 0

動態代理

動態代理的場景是一對多的關系,即是一個代理類,多個被代理的類。

在動態代理中,不再關注向客戶端屏蔽原始對象(客戶端可以看到原始對象),而重點是對于一系列的原始實現類,能夠對抽象中的方法進行統一的橫向擴展(方法執行前/后的操作),而不需要為每一個原始實現類都創建一個代理。

動態代理的原理,會在下篇文章中進行分析。

案例

以汽車(抽象)行駛為例子,我們要統計多種車型(原始實現類)通過某段距離的用時。在汽車行駛前,需要進行開始計時的操作(功能擴展)。汽車行駛后,要進行結束計時的操作(功能擴展)。

實現

抽象接口

public interface Moveable {void move() throws Exception;void move_back() throws Exception; }

定義實現類

import java.util.Random;public class Car implements Moveable {public void move() throws Exception {Thread.sleep(new Random().nextInt(1000));System.out.println("轎車行駛中…");}public void move_back() throws Exception {Thread.sleep(new Random().nextInt(1000));System.out.println("轎車向后行駛中…");} } import java.util.Random;public class Truck implements Moveable {public void move() throws Exception {Thread.sleep(new Random().nextInt(1000));System.out.println("卡車行駛中…");}public void move_back() throws Exception {Thread.sleep(new Random().nextInt(1000));System.out.println("卡車向后行駛中…");} }

定義動態代理工具類
動態代理工具類需要實現InvocationHandler接口,實現invoke方法,通過反射實現對抽象接口方法的調用method.invoke(target, args);。

import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method;public class TimeHandler implements InvocationHandler {private Object target;public TimeHandler(Object target) {super();this.target = target;}public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {long startTime = System.currentTimeMillis();System.out.println("汽車開始行駛…");method.invoke(target, args);long stopTime = System.currentTimeMillis();System.out.println("汽車結束行駛…汽車行駛時間:" + (stopTime - startTime) + "毫秒!");return null;}}

驗證程序

import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy;public class Test {public static void main(String[] args) throws Exception{Car car = new Car();Class<?> cls = car.getClass();InvocationHandler h = new TimeHandler(car);Moveable m = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(), h);m.move();System.out.println("");m.move_back();System.out.println("");System.out.println("");Truck truck = new Truck();cls = truck.getClass();h = new TimeHandler(truck);m = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(), h);m.move();System.out.println("");m.move_back();System.out.println("");System.out.println("");} }

運行結果

汽車開始行駛…
轎車行駛中…
汽車結束行駛…汽車行駛時間:200毫秒!

汽車開始行駛…
轎車向后行駛中…
汽車結束行駛…汽車行駛時間:681毫秒!

汽車開始行駛…
卡車行駛中…
汽車結束行駛…汽車行駛時間:492毫秒!

汽車開始行駛…
卡車向后行駛中…
汽車結束行駛…汽車行駛時間:338毫秒!

Process finished with exit code 0

總結

代理模式優缺點:

  • 靜態代理模式:優點是具有較好的擴展性,屏蔽原始實現類;缺點是增加了中間層可能會導致性能下降。
  • 動態代理模式:優點是能對多個原始實現類進行統一的功能擴展;缺點是增加了中間層可能會導致性能下降。

代理模式與裝飾器模式的區別:

  • 代理模式強調對于訪問的控制,在調用實體類的方法之前或者之后,會添加一些操作,是擴展的廣度。裝飾器模式強調對于方法的加強,擴展的深度。打個比方,張無忌學習乾坤大挪移。裝飾器模式,則增加其深度,從第3層境地學習到第4層境地,注重功能的加強。代理模式則是讓其在學習乾坤大挪移之前,先學習一下九陽神功,兩種武功能夠有所聯系。從外界看來,都是武功的增強,但是一個是深度,一個是廣度。
  • 代理模式是代理,裝飾器模式是裝飾,兩者在對原始對象的可見性上是不同的。代理模式中,在客戶看來,無法感知到原始對象,只能接觸代理對象。裝飾器模式中,客戶看來,是能夠感知到原始對象的。

總結

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

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

主站蜘蛛池模板: 欧美日韩国产在线观看 | 国产人妻一区二区 | 激情播播网 | 秋霞在线视频 | 久色资源 | a级片免费在线观看 | youjizz少妇 | 日韩亚洲在线 | 国产亚洲视频在线 | 日韩激情视频网站 | 国产成人精品999在线观看 | 精品96久久久久久中文字幕无 | 亚洲色图偷 | 99精品视频国产 | 亚洲图片欧美日韩 | 国产成年人视频 | 色综合久久88色综合天天免费 | 亚洲AV无码片久久精品 | 美女bb视频 | 久久99国产精品一区 | 国产精品黄 | 福利社午夜影院 | 黄色视屏在线免费观看 | 国产一区二区三区在线免费 | 国产乱淫av片| 日韩三级精品 | 欧美日韩久久久久 | 欧美日韩精品在线 | 国产稀缺真实呦乱在线 | 欧美福利电影 | 欧美精品国产 | 久久精品黄 | 国产专区自拍 | 医生强烈淫药h调教小说视频 | 毛片基地在线观看 | 日本最黄网站 | 青草精品视频 | 亚洲一二三精品 | 欧美日韩在线播放 | 亚洲爱情岛论坛永久 | 日韩精品五区 | 日韩最新中文字幕 | 国产精品熟妇一区二区三区四区 | 国产91在线观看 | 亚洲不卡网 | 精品成人| 五月激情综合婷婷 | aaa特级毛片 | 亚洲综合五月天 | 成人免费毛片片v | 日韩激情免费 | 黄视频网站在线 | 双性皇帝高h喷汁呻吟 | 中文字幕 欧美激情 | 国产精品无码一区二区无人区多人 | 女优一区二区三区 | 在线免费国产视频 | 国产三级一区 | 欧美一级夜夜爽 | 综合色播| 国产一区在线不卡 | 女生扒开尿口让男生桶 | 在线观看免费黄色 | 国产h视频在线 | 国产一区二区黑人欧美xxxx | 老熟女毛茸茸浓毛 | 中文在线天堂网 | 午夜秋霞影院 | 日韩一区欧美 | 日韩电影中文字幕 | 日本三级全黄 | 男女洗澡互摸私密部位视频 | 综合色导航 | 中文文字幕文字幕高清 | 欧美黄页网站 | 亚洲第一av | 亚洲欧美精品一区二区三区 | 无遮挡毛片 | 性爽爽| 潮见百合子 | 国产在线观看黄色 | 免费成人小视频 | 白白色免费视频 | 免费国产羞羞网站视频 | 五月天国产精品 | 靠逼网站在线观看 | 男女男网站 | 亚洲欧美日韩免费 | 9i看片成人免费高清 | 欧美日韩精品久久 | 精品99视频 | 国产精品久久久爽爽爽麻豆色哟哟 | 亚洲性欧美 | 亚洲国产高清视频 | 亚洲国产97在线精品一区 | 日韩av不卡在线观看 | 国产美女菊爆在线播放APP | 麻豆91视频 | 欧美精品aaa |