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

歡迎訪問 生活随笔!

生活随笔

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

java

Java描述设计模式(16):代理模式

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

本文源碼:GitHub·點這里 || GitEE·點這里

一、生活場景

1、場景描述

在電商高速發展的今天,快遞的數量十分龐大,甚至出現了快遞代理行業,簡單的說就是快遞的主人沒有時間收快遞,會指定一個快遞的代收點,比如快遞柜,快遞驛站等,然后等有時間的時候再過去取,下面使用代碼對這個場景進行簡單的描述。

2、場景圖解

3、源碼實現

public class C01_InScene {public static void main(String[] args) {/*自己收快遞的測試方式*/GetExpress getExpress = new GetExpress();getExpress.sureInfo();getExpress.signName("張三");/*代收快遞的測試方式*/ExpressAct getUser = new GetExpress();ExpressAct getProxy = new ProxyExpress(getUser);getProxy.sureInfo();getProxy.signName("李四");} } /*** 接收一個快遞的動作接口:確認信息,簽名*/ interface ExpressAct{void sureInfo();void signName(String name); } /*** 定義一個類接收快遞:自己去拿快遞*/ class GetExpress implements ExpressAct{@Overridepublic void sureInfo() {System.out.println("請確認你的個人信息!");}@Overridepublic void signName(String name) {System.out.println("你的名字是:"+name);} } /*** 定義一個類接收快遞:找人代領快遞*/ class ProxyExpress implements ExpressAct{private ExpressAct expressAct=null;public ProxyExpress(ExpressAct expressAct){this.expressAct = expressAct;}@Overridepublic void sureInfo() {this.expressAct.sureInfo();}@Overridepublic void signName(String name) {this.expressAct.signName(name);} }

二、代理模式

1、概念描述

代理模式是對象的結構模式。代理模式給某一個對象提供一個代理對象,并由代理對象控制對原對象的引用。所謂代理,就是一個對象代表另一個對象執行相應的動作程序。而代理對象可以在客戶端和目標對象之間起到中介的作用。

2、模式圖解

3、核心角色

  • 抽象對象角色

聲明目標對象和代理對象的共同接口。

  • 目標對象角色

定義了代理對象所代表的目標對象。

  • 代理對象角色

代理對象內部含有目標對象的引用,可以在任何時候操作目標對象;代理對象提供一個與目標對象相同的接口,可以在任何時候替代目標對象。代理對象通常在客戶端調用傳遞給目標對象之前或之后,執行某個操作,而不是單純地將調用傳遞給目標對象,AOP編程就是基于這個思想。

4、源碼實現

public class C02_Proxy {public static void main(String[] args) {AbstractObject object = new ProxyObject();object.operation();} } /*** 抽象對象角色*/ abstract class AbstractObject{public abstract void operation(); } /*** 目標對象角色*/ class TargetObject extends AbstractObject{@Overridepublic void operation() {System.out.println("Target Method Run...");} } /*** 代理對象角色*/ class ProxyObject extends AbstractObject{TargetObject targetObject = new TargetObject();@Overridepublic void operation() {System.out.println("Method Before...");targetObject.operation();System.out.println("Method After...");} }

三、JDK動態代理

基于JDK動態代理方式實現AOP切面編程。

1、代碼實現

public class C03_JdkProxy {public static void main(String[] args) {BookService bookService = BookAopProxyFactory.createService() ;System.out.println(bookService.getBook());} } class BookAspect {public void before (){System.out.println("Method Before ...");}public void after (){System.out.println("Method After ...");} } interface BookService {String getBook () ; } class BookServiceImpl implements BookService {@Overridepublic String getBook() {System.out.println("目標方法【getBook】被執行");return "高性能MySQL";} } class BookAopProxyFactory {public static BookService createService() {// 目標類final BookService bookService = new BookServiceImpl() ;// 切面類final BookAspect bookAspect = new BookAspect();/** 代理類:將目標類(切入點)和 切面類(通知) 結合*/BookService proxyBookService = (BookService) Proxy.newProxyInstance(BookAopProxyFactory.class.getClassLoader(),bookService.getClass().getInterfaces(),new InvocationHandler() {public Object invoke(Object proxy, Method method,Object[] args) throws Throwable {// 前執行bookAspect.before();// 執行目標類的方法Object obj = method.invoke(bookService, args);// 后執行bookAspect.after();return obj;}});return proxyBookService ;} }

四、幾種常見代理

  • 防火墻代理

內網通過代理穿透防火墻,實現對公網的訪問。

  • 緩存代理

為了緩解網站并發壓力,在請求數據庫資源時,先取緩存中代理的數據,如果緩存未命中,再到數據庫取數據,然后緩存取到的數據。

  • 遠程代理

遠程對象的本地代理對象,通過它可以把遠程對象當本地對象調用 。遠程代理通過網絡和調用的遠程對象進行信息交互 。

  • 同步代理

主要使用在多線程編程中,完成多線程間同步工作。

五、源代碼地址

GitHub·地址 https://github.com/cicadasmile/model-arithmetic-parent GitEE·地址 https://gitee.com/cicadasmile/model-arithmetic-parent

總結

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

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