通過代理模式 + 責任鏈模式實現對目標執行方法攔截和增強功能

前言

? ? ? ? ?最近需要實現一個插件功能,但是如果做成兩個接口的話(即執行前和執行后),那么會降低插件的可玩性,所以需做成類似AOP的環繞通知形式,所以就使用到了責任鏈模式和代理模式進行實現。

介紹

代理模式(Proxy Pattern)

????????定義:由于某些原因需要給某對象提供一個代理以控制對該對象的訪問。這時,訪問對象不適合或者不能直接引用目標對象,代理對象作為訪問對象和目標對象之間的中介。

????????UML:

?

Java中,常見代理模式的實現有Java靜態、動態代理,CGLIB動態代理,JAVAssist動態代理等等。

責任鏈模式(Chain of Responsibility Pattern)

?????? 定義:為請求創建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。這種類型的設計模式屬于行為型模式。

在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推。

????????UML:

可以把它理解為一個鏈表,每個節點上的對象都實現了同一個接口,并且在對象內部指向下一個節點對象,在開始執行第一個節點的時候,就會傳遞到每一個節點

常見的責任鏈實現有 Servlet中的Filter,SpringMVC的Intercept攔截器,AOP中的環繞通知,Mybatis的插件功能,Druid中Filter等等。

實現

實現一個簡單的目標執行器執行

定義一個Executor接口,TargetExecutor實現Executor并實現execute方法,然后通過Executor進行調用,定義一個參數對象,模擬真實業務場景。

現在需要通過代理和責任鏈實現對Executor的execute方法進行批量增強

定義一個封裝代理對象

這個對象是用來在攔截器里面手動調用執行目標方法的,這樣就可以在攔截前和攔截后做一些業務處理等等。

?

1:proceed():當調用Proceed對象的proceed方法時,即執行代理對象的目標方法

2:targetObject: 為真實的執行對象(這個是為了記錄真實的目標執行對象,可以直接操作目標對象)

3:targetProxy: 為真實/代理對象(第一個攔截器為真實對象,后面的就是前一個攔截器的代理對象)

4:args: 目標執行對象調用方法的參數

定義一個責任鏈共用接口以及生成代理對象的共用方法

責任鏈中的共用實現接口

?

1:intercept():

?????? 每個攔截器都需要實現的方法,參數為Proceed對象,每個具體的攔截器可根據具體邏輯進行操作真實的Executor對象和ParamEvent參數對象

2:newProxy():

?????? 創建目標對象的代理方法,由于這里目標執行對象是使用接口實現的方式,所以使用的是JDK的動態代理,如果是普通的類,則可以使用CGLIB動態代理生成代理類

實現代理類的具體執行方法,進行對目標對象的增強

目標執行對象方法真實執行類,當目標執行對象調用目標執行方法時,需要調用攔截器的intercept方法,由攔截器手動調用proceed方法,進入下一個攔截器,因此形成調用鏈路。

?

1:targetObject: 具體目標執行對象

2:targetProxy:為真實/代理對象

3:intercept:下一個鏈路節點對象

4:invoke: 動態代理接口執行方法,該方法里面為調用攔截器得intercept方法

創建管理責任鏈鏈路對象

用于管理和創建目標執行對象的代理對象

?

1:interceptList:所有實現鏈路接口的對象有序集合

2:addIntercept():添加鏈路節點對象方法

3:createProxy(): 創建代理對象方法,參數為target(具體執行對象),利用循環創建代理對象將所有的攔截器生成一個責任鏈鏈路。

驗證

記錄execute方法的運行時間攔截器

修改目標執行方法的對象參數攔截器

修改目標執行對象屬性值攔截器

?

  • 查看運行結果:

?

攔截器功能實現成功!

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

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

相關文章

Javascript基礎之-原型(prototype)

首先呢,prototype是對象里的一個內置屬性,并且呢,這個屬性是對于其他對象的一個引用。所以呢,思考下面的例子: var obj {a: 2 } var myObj Object.create(obj); console.log(myObj.a); // 2 console.log(myObj obj)…

Oracle查詢今天、昨天、本周、上周、本月、上月數據

查詢今天數據: SELECT COUNT(1) FROM T_CALL_RECORDS WHERE TO_CHAR(T_RKSJ,YYYY-MM-DD)TO_CHAR(SYSDATE,YYYY-MM-DD); 查詢昨天數據: SELECT COUNT(1) FROM T_CALL_RECORDS WHERE TO_CHAR(T_RKSJ,YYYY-MM-DD)TO_CHAR(SYSDATE-1,YYYY-MM-DD)&…

usb一轉多 樹莓派zero_樹莓派 Zero USB/以太網方式連接配置教程

樹莓派 Zero 之所以成為一款非常棒的單板計算機并不全因為它小巧的尺寸和便宜的價格,還得益于它便捷、易用的特性。在加裝了 Zero Quick Plug 或 microUSB/USB 轉換頭之后,將樹莓派 Zero 和電腦連接起來。樹莓派 Zero 即可配置成 USB/以太網設備&#xf…

vscode Go 1.11.4 編譯錯誤 need Delve built by Go 1.11 or later

更新golang的版本為1.11.4之后vscode編譯錯誤:executables built by Go 1.11 or later need Delve built by Go 1.11 or later 原因是delve的版本太老了,需要更新,且delve的github地址已經更換,很多教程里的地址是不對的 新地址安…

oppo的sd卡在哪里打開_oppo的sd卡在哪里打開

大家好,我是時間財富網智能客服時間君,上述問題將由我為大家進行解答。以oppo A91為例,其sd卡可直接在文件管理頁面的存儲里面即可打開。OPPO A91的屏幕為6.4英寸,主屏分辨率2400乘以1080像素,機身顏色有暗夜星辰&…

Navicat使用教程:使用Navicat Query Analyzer優化查詢性能(第1部分)

下載Navicat Monitor最新版本Navicat Monitor 是一套安全、簡單而且無代理的遠程服務器監控工具。它具有強大的功能使你的監控發揮最大效用。受監控的服務器包括 MySQL、MariaDB 和 Percona Server,并與 Amazon RDS、Amazon Aurora、Oracle Cloud、Microsoft Azure …

dg oracle 切換模式_Oracle數據庫 DGbroker三種保護模式的切換

1.三種保護模式– Maximum protection在Maximum protection下, 可以保證從庫和主庫數據完全一樣,做到zero data loss.事務同時在主從兩邊提交完成,才算事務完成。如果從庫宕機或者網絡出現問題,主從庫不能通訊,主庫也立…

軟件包管理

應用程序:程序:Architecture C語言:源代碼-->(編譯) 二進制格式腳本:解釋器(二進制程序) 源代碼-->編譯-->鏈接-->運行程序:指令數據指令:芯片CP…

工業機器人碼垛教學實施_工業機器人應用案例碼垛詳解

工業機器人應用案例碼垛詳解隨著科技的進步以及現代化進程的加快,人們對搬運速度的要求越來越高,傳統的人工碼垛只能應用在物料輕便、尺寸和形狀變化大、吞吐量小的場合,這已經遠遠不能滿足工業的需求,機器人碼垛機應運而生。機器…

第一家云創大數據產業學院在佛山職業技術學院掛牌

2019年1月10日,“云創大數據產業學院揭牌暨戰略合作協議簽署儀式”在佛山職業技術學院電子信息學院會議室舉行。云創大數據總裁劉鵬教授、市場部經理單明月,佛山職業技術學院電子信息學院院長唐建生、副院長田鈞、學院辦公室主任趙雪章、信息工程系主任喬…

String與StringBuffer和StringBuilder的根本區別

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

16進制 ksh_AIX系統中如何統計進程打開的文件數目

作者:李燁楠 中國建設銀行來自微信公眾號:平臺人生環境: AIX 6.1 AIX7.1前言:用戶有時需要統計一個進程打開的文件數目,比如,在當前打開文件句柄使用量是否超過用戶資源限制(/etc/security/limits)中 nofiles的取值時。那么&#…

前端Http協議緩存初解

[TOC] 簡介 用戶獲取網絡資源,需要通過非常長的網絡去服務器上請求資源,另外服務端為了應對大量的用戶請求而不斷的提升硬件性能與帶寬。這對用戶與服務端都非常的不友好。而緩存就是為了解決用戶請求速度與釋放服務器壓力而生的。 為什么我會寫Http緩存&#xff0c…

詳解java訪問修飾符

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

educoder 二進制數據的位運算_二進制與位運算實用操作匯總(基礎篇)

位運算是最高效而且占用內存最少的算法操作,但也是最難看懂的操作。然而,關于位運算的用法,筆者查了許多資料,似乎都沒有找到詳細而系統的講解資料。筆者對位運算的操作相當感興趣,因此斗膽嘗試對位運算來一個的總結。…

企業為什么要做SEO,它的重要性有哪些?

對于SEO工作而言,我們知道一個網站做SEO的基礎訴求就是讓用戶和搜索引擎更好的理解網站內容,雖然隨著搜索引擎算法技術的迭代,目前SEO面臨更大的挑戰與競爭,但基于搜索營銷,它目前仍然顯得十分重要。 那么&#xff0…

白話說編程之java線程

白話說編程之java線程線程和進程:進程:線程:線程和進程的區別:詳解多線程:并發為什么使用并發并發的執行原理并行線程的五種狀態:創建狀態:就緒狀態:運行狀態:阻塞狀態:死…

powerdesigner顯示工具面板_photoshop教程-畫筆工具預設與選項設置

定義畫筆預設在打開的“畫筆”面板中,單擊左側的“畫筆筆尖形狀”名稱,可顯示筆尖形狀圖案。單擊“畫筆”面板左側其他不同的選項名稱,在右側就會顯示其對應的調節項。只單擊不同選項前面的方框,可使此選項有效,但右側…

C#屬性的聲明和使用演示源碼片段

工作閑暇時間,將代碼過程重要的一些代碼做個收藏,如下代碼是關于C#屬性的聲明和使用演示片段的代碼,應該對碼農有一些好處。 using System; class Person {private string myName "N/A";private int myAge 0;public string Name{g…

深入理解== 和 equals 的區別

深入理解 和 equals 的本質區別簡介區別:圖解:注意點:源碼分析:總結分享一波:程序員賺外快-必看的巔峰干貨簡介 初學者常常被" “和‘equals ’所折磨,為什么,因為他們的大概意思相同,都是…