代理模式【Proxy Pattern】

什么是代理模式呢?我很忙,忙的沒空理你,那你要找我呢就先找我的代理人吧,那代理人總要知道
被代理人能做哪些事情不能做哪些事情吧,那就是兩個人具備同一個接口,代理人雖然不能干活,但是被
代理的人能干活呀。
舉例子:
比如西門慶找潘金蓮,那潘金蓮不好意思答復呀,咋辦,找那個王婆做代理
類圖如下

(1).靜態代理

  1. 定義同一種類型的接口
  2. 定義同一種類型接口的實現
  3. 定義代理類

?1.先定義一種類型的女人:

package proxy;/*** * 定義一種類型的女人,王婆和潘金蓮都屬于這個類型的女人** @author 1* @version 1.0* @description: TODO* @date 2023/8/14 14:43*/
public interface KindWomen {/*** 拋媚眼*/public void makeEyesWithMan();/*** 開心約會*/public void happyWithMan();}

2.實現接口

package proxy;/*** 潘金蓮** @author 1* @version 1.0* @description: TODO* @date 2023/8/14 14:45*/
public class PanJinLian implements KindWomen {@Overridepublic void makeEyesWithMan() {System.out.println("潘金蓮拋媚眼");}@Overridepublic void happyWithMan() {System.out.println("潘金蓮和男人開心約會");}
}

3.定義代理類

package proxy;/*** 代理類* 王婆(幫忙給西門慶代理)** @author 1* @version 1.0* @description: TODO* @date 2023/8/14 14:46*/
public class WangPo implements KindWomen {private KindWomen kindWomen;/*** 王婆默認就是潘金蓮的代理*/public WangPo() {this.kindWomen = new PanJinLian();}/*** 王婆可以代理這個類型的所有人** @param kindWomen*/public WangPo(KindWomen kindWomen) {this.kindWomen = kindWomen;}@Overridepublic void makeEyesWithMan() {//實際做事的是代理類this.kindWomen.makeEyesWithMan();}@Overridepublic void happyWithMan() {//實際做事的是代理類this.kindWomen.happyWithMan();}
}

4.找到代理類進行調用

package proxy;/*** 西門慶** @author 1* @version 1.0* @description: TODO* @date 2023/8/14 14:50*/
public class XiMenQing {public static void main(String[] args) {System.out.println("(1)靜態代理******************");//西門慶找到王婆,然后王婆就作為代理,幫忙安排了和潘金蓮的約會WangPo wangPo = new WangPo();//王婆默認的代理就是潘金蓮wangPo.makeEyesWithMan();wangPo.happyWithMan();//傳參數執行WangPo wangPo2 = new WangPo(new PanJinLian());wangPo2.makeEyesWithMan();wangPo2.happyWithMan();System.out.println("(2)動態代理******************");KindWomen kindWomen = (KindWomen)new ProxyFactory(new PanJinLian()).getProxyInstance();System.out.println("生成的代理對象"+kindWomen.getClass());kindWomen.makeEyesWithMan();kindWomen.happyWithMan();}
}

(2).動態代理

package proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** @author 1* @version 1.0* @description: TODO* @date 2023/8/14 14:58*/
public class ProxyFactory {//維護一個目標對象 , Objectprivate Object target;//構造器 , 對target 進行初始化public ProxyFactory(Object target) {this.target = target;}//動態生成一個代理對象public Object getProxyInstance() {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() { //匿名類重寫invoke方法@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("動態代理開始");Object returnVal = method.invoke(target, args);//反射機制調用目標對象的方法System.out.println("動態代理結束");return returnVal;}});}
}

執行結果如下:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36952.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36952.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36952.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決 Mac 上使用 Electron Updater 更新 App 不成功的問題!!!

文章目錄 1. 現象2. 分析并如何解決3. 后續 1. 現象 在Mac電腦上,使用Electron Updater對程序進行更新,但是一直不成功,也不報錯。具體表現是這樣的:當前我的程序版本是3.11版本,點擊更新之后,也下載了&am…

11 迭代器|生成器|協程

文章目錄 迭代器可迭代對象可迭代對象的本質iter()函數與 next()函數迭代器 Iterator樣例 for...in...循環的本質使用的場景--斐波那契數列list和tuple也可以接收可迭代對象 生成器簡介創建生成器方法一方法二總結 使用 send 喚醒 協程協程和線程差異簡單實現協程greenletgeven…

微PE工具箱實現U盤重裝Windows系統

教程來源 U盤重裝Windows系統(微PE工具箱)_嗶哩嗶哩_bilibili 加上自己的一丟丟理解,如果你覺得長視頻看了犯困,不如看看我的理解文章說不定能夠幫助到你 準備工作 到這個網站使用迅雷下載免費無插件的官方鏡像MSDN, 我告訴你…

JVM筆記 —— 出現內存溢出錯誤時時如何排查

一、出現內存溢出的幾種情況 內存溢出錯誤分為StackOverflowError和OutOfMemoryError,前者是棧中出現溢出,后者一般是堆或方法區出現溢出,簡稱OOM 1. 棧溢出 StackOverflowError 棧溢出一般都是因為沒有正確的結束遞歸導致的,無…

Linux中安裝MySQL8版本,安裝MySQL步驟,MySQL8離線安裝

Linux中安裝MySQL8版本的步驟如下: 1.檢查下libaio.so.1的位置 [roottdx ]# whereis libaio.so.1 libaio.so: /usr/lib64/libaio.so.1 如果沒有找到該文件 (1).在線安裝 [roottdx ]# yum install -y libaio (2).離線安裝: 上傳之后執行命令安裝&#…

pymysql 庫 - python 操作 mysql

環境: Win10 x64 Python 3.7 PyMySQL 1.0.2 MySQL 8.0.27 1 安裝 pip install pymysql 2 地址 https://pypi.org/project/pymysql/ 3.1 數據庫版本查詢 (search_version.py) import pymysql# 打開數據庫連接 try:db pymysql.connect(hostlocalhost, userr…

python安裝第三方包時報錯:...\lib\site-packages\pip\_vendor\urllib3\response.py...

安裝redis第三方包: pip install redis報錯現象: 解決方法:使用以下命令可成功安裝 pip install redis -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

關于網絡入侵檢測領域使用Spark/Flink等計算框架做分布式

關于網絡入侵檢測領域使用Spark/Flink等計算框架做分布式 0、引言1 基于LightGBM的網絡入侵檢測研究2 基于互信息法的智能化運維系統入侵檢測Spark實現3 基于Spark的車聯網分布式組合深度學習入侵檢測方法4 基于Flink的分布式在線集成學習框架研究5 基于Flink的分布式并行邏輯回…

mongodb基礎

mongodb語法 參考文檔:https://docs.mongodb.com/manual/reference/ BSON Types BSON Type有2種標識符,整形和字符串 類型數值字符串說明Double1“double”String2“string”Object3“object”Array4“array”Binary data5“binData”Undefined6“un…

8.9黃金最新行情走勢分析及短線交易策略

近期有哪些消息面影響黃金走勢?黃金多空該如何研判? ?黃金消息面解析:周三(8月9日)現貨黃金維持震蕩,目前交投于1930美元附近,隔日現貨黃金盤中震蕩下行,失守1930關口并在美盤時段…

【Spring】-Spring的IoC和DI

作者:學Java的冬瓜 博客主頁:?冬瓜的主頁🌙 專欄:【Framework】 主要內容:什么是spring?IoC容器是什么?如何使代碼解耦合?IoC的核心原理,IoC的優點。依賴注入/對象裝配/…

【ARM 嵌入式 編譯系列 10 -- GCC 編譯縮減可執行文件 elf 文件大小】

文章目錄 GCC 如何縮減可執行文件size測試代碼 上篇文章:ARM 嵌入式 編譯系列 9-- GCC 編譯符號表(Symbol Table)的詳細介紹 下篇文章:ARM 嵌入式 編譯系列 10.1 – GCC 編譯縮減可執行文件 elf 文件大小 GCC 如何縮減可執行文件s…

Linux下在qtcreator中創建qt程序

目錄 1、新建項目 2、單工程項目創建 3、多工程項目創建 4、添加子工程(基于多工程目錄結構) 5、 .pro文件 1、新建項目 切換到“編輯”界面,點擊菜單欄中的“文件”-“新建文件或項目” 2、單工程項目創建 只有一個工程的項目&#…

Axure RP移動端高保真CRM辦公客戶管理系統原型模板及元件庫

Axure RP移動端高保真CRM辦公客戶管理系統原型模板及元件庫,一套典型的移動端辦公工具型APP Axure RP原型模板,可根據實際的產品需求進行擴展,也可以作為移動端原型設計的參考案例。為提升本作品參考價值,在模板設計過程中盡量追求…

chatGPT應用于房地產行業

作為 2023 年的房地產專業人士,您無疑認識到技術對行業的重大影響。近年來,一項技術進步席卷了世界——人工智能。人工智能徹底改變了房地產業務的各個方面,從簡化管理任務到增強客戶互動。 在本文中,我們將探討幾種巧妙的人工智…

HTML 語言簡介

1.概述 HTML 是網頁使用的語言,定義了網頁的結構和內容。瀏覽器訪問網站,其實就是從服務器下載 HTML 代碼,然后渲染出網頁。 HTML 的全名是“超文本標記語言”(HyperText Markup Language),上個世紀90年代…

zabbix自動注冊服務器以及部署代理服務器

文章目錄 Zabbix自動注冊服務器及部署代理服務器一.zabbix自動注冊1.什么是自動注冊2.環境準備3.zabbix客戶端配置4.在 Web 頁面配置自動注冊5.驗證自動注冊 二.部署 zabbix 代理服務器1.分布式監控的作用:2.環境部署3.代理服務器配置4.客戶端配置5.web頁面配置5.1 …

MS9940T 國產 模擬前端AFE芯片 11-15 節鋰電池或磷酸鹽電池管理芯片 替代BQ76940

產品簡述 MS9940T 是模擬前端 (AFE) 芯片,支持11 到 15 組電池串聯。通過 I 2 C ,主機控制器 可以使用 MS9940T 來實現電池組管理功能,例如監控(電池電壓、電池組電流、電池組 溫度)、保護(控制…

分類預測 | MATLAB實現GWO-BiLSTM-Attention多輸入分類預測

分類預測 | MATLAB實現GWO-BiLSTM-Attention多輸入分類預測 目錄 分類預測 | MATLAB實現GWO-BiLSTM-Attention多輸入分類預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 1.GWO-BiLSTM-Attention 數據分類預測程序 2.代碼說明:基于灰狼優化算法&#xff08…

vuejs 設計與實現 - 組件的實現原理

1.渲染組件 如果是組件則:vnode .type的值是一個對象。如下: const vnode {type: MyComponent,}為了讓渲染器能處理組件類型的虛擬節點,我們還需要在patch函數中對組件類型的虛擬節點進行處理,如下: function patc…