動態代理3之代理工廠實現

動態代理的深化:承接動態代理2( 對 上級實例進行 深化),也就是 spring 的前身

(必須掌握)實例:

文件說明:1.有一個Waiter接口,該接口有一個 server() 、ShouQian()方法

2.有一個 Waiter接口的實現類,ManWaiter類

3.一個 測試Test類

???? 4. 后置增強接口: AfterAdvice 接口

???? 5.前置增強接口:BeforeAdvice接口

???? 6. 生成代理對象 的 ProxyFactory類

1. Waiter.java 接口

// 服務員

public interface Waiter {

????// 服務

????public void serve();

????

????//收錢

????public void shouQian();

}

?

2. BeforeAdvice.java 接口,前置增強接口

/**

* 前置增強

* @author cxf

*

*/

public interface BeforeAdvice {

????public void before();

}

?

3. AfterAdvice.java 接口,后置增強接口

/**

* @function 后置增強

* @author not-bug

*

*/

public interface AfterAdvice {

????public void after();

}

?

4 . ManWaiter.java 類,該類實現了 Waiter接口

//該類實現了 Waiter 接口

public class ManWaiter implements Waiter {

????public void serve() {

????????System.out.println("服務中...");

????}

????

????public void shouQian() {

????????System.out.println("混蛋,給我錢!");

????}

}

?

5. ProxyFactory.java 類,用來生成代理對象的類

/**

* 它用來生成代理對象

* 它需要所有的參數

* * 目標對象

* * 增強

* @author cxf

*/

/**

* 1. 創建代理工廠

* 2. 給工廠設置三樣東西:

* * 目標對象:setTargetObject(xxx);

* * 前置增強:setBeforeAdvice(該接口的實現)

* * 后置增強:setAfterAdvice(該接口的實現)

* 3. 調用createProxy()得到代理對象

* * 執行代理對象方法時:

* > 執行BeforeAdvicebefore()

* > 目標對象的目標方法

* > 執行AfterAdviceafter()

* @author cxf

*

*/

public class ProxyFactory {

????private Object targetObject;//目標對象

????private BeforeAdvice beforeAdvice;//前置增強

????private AfterAdvice afterAdvice;//后置增強

???? ?

????

????/**

???? * 用來生成代理對象

???? * @return

???? */

????public Object createProxy() {

????????/*

???????? * 1. 給出三大參數

???????? */

????????ClassLoader loader = this.getClass().getClassLoader();

????????Class[] interfaces = targetObject.getClass().getInterfaces();

????????InvocationHandler h = new InvocationHandler() {

????????????public Object invoke(Object proxy, Method method, Object[] args)

????????????????????throws Throwable {

????????????????/*

???????????????? * 在調用代理對象的方法時會執行這里的內容

???????????????? */

????????????????// 執行前置增強

????????????????if(beforeAdvice != null) {

????????????????????beforeAdvice.before();

????????????????}

????????????????

????????????????Object result = method.invoke(targetObject, args);//執行目標對象的目標方法

????????????????// 執行后置增強

????????????????if(afterAdvice != null) {

????????????????????afterAdvice.after();

????????????????}

????????????????

????????????????// 返回目標對象的返回值

????????????????return result;

????????????}

????????};

????????/*

???????? * 2. 得到代理對象

???????? */

????????Object proxyObject = Proxy.newProxyInstance(loader, interfaces, h);

????????return proxyObject;

????}

???? ?

????

????public Object getTargetObject() {

????????return targetObject;

????}

????public void setTargetObject(Object targetObject) {

????????this.targetObject = targetObject;

????}

????public BeforeAdvice getBeforeAdvice() {

????????return beforeAdvice;

????}

????public void setBeforeAdvice(BeforeAdvice beforeAdvice) {

????????this.beforeAdvice = beforeAdvice;

????}

????public AfterAdvice getAfterAdvice() {

????????return afterAdvice;

????}

????public void setAfterAdvice(AfterAdvice afterAdvice) {

????????this.afterAdvice = afterAdvice;

????}

}

?

6. Test.java ,測試類

?

/*

* 目標是讓目標對象和增強都可以切換!

*/

public class Demo3 {

????@Test

????public void fun1() {

????????ProxyFactory factory = new ProxyFactory();//創建工廠

????????factory.setTargetObject(new ManWaiter());//設置目標對象

????????factory.setBeforeAdvice(new BeforeAdvice() {//設置前置增強

????????????public void before() {

????????????????System.out.println("您好不好!");

????????????}

????????});

????????

????????factory.setAfterAdvice(new AfterAdvice() {//設置后置增強

????????????public void after() {

????????????????System.out.println("再見不見!");

????????????}

????????});

????????

????????Waiter waiter = (Waiter)factory.createProxy();

????????//waiter.shouQian();

????????waiter.serve();

????}

????

????//轉賬方法

????public void zhuanZhang() {

????????/*

???????? * 1.

???????? * 2.

???????? * 3.

???????? */

????}

}

?

運行結果:

轉載于:https://www.cnblogs.com/Prozhu/p/5452962.html

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

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

相關文章

一個簡單的XML文檔例子

一個簡單的XML文檔例子: <?xml version"1.0"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Dont forget me this weekend!</body> </note> 文檔的第一…

python set

python的set和其他語言類似, 是一個無序不重復元素集, 基本功能包括關系測試和消除重復元素. 集合對象還支持union(聯合), intersection(交), difference(差)和sysmmetric difference(對稱差集)等數學運算. sets 支持 x in set, len(set),和 for x in set。作為一個無序的集…

【bug修復】解決ValueError: Tensor(“Variable:0“ dtype=float32_ref) must be from the same graph as Tensor(“R

bug:描述 在進行tensorflow進行搭建CNN網絡時&#xff0c;在定義CNN的py文件中調用cnn模型&#xff0c;運行正常&#xff0c;但是在其他py文件中進行時就出現問題 ValueError: Tensor(“Variable:0” dtypefloat32_ref) must be from the same graph as Tensor(“Reshape:0”,…

XML —— DTD介紹

一、DTD介紹 Document Type Definition&#xff1b; DTD是一種XML的約束方式&#xff0c;除了此種約束方式外&#xff0c;還有XSchema&#xff0c;XSchema比DTD的約束能力還要強&#xff0c;因此DTD正在逐漸淘汰&#xff1b; DTD的目的就是約束XML標簽的寫法&#xff1b;比如在…

error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

更新的軟件可以解決 TortoiseGit-preview-2.5.7.0-20180127-b2d00f8-64bit.msi和Git-2.16.2-64-bit.exe。 鏈接地址為&#xff1a; https://github.com/git-for-windows/git/releases/download/v2.16.2.windows.1/Git-2.16.2-64-bit.exe https://download.tortoisegit.org/tgi…

Linux 圖片傳輸功能c/c++(初版)

由于深度學習任務的需要&#xff0c;要在程序里面嵌入一個module。 這個module 的功能是接收來自ios客戶端的圖片。并且傳送給深度學習分類器進行處理。 于是看了看各種各樣的 module 實現方案。 先是用IO函數把圖片以數組的方式存起來。 再和服務器建立連接&#xff0c;socket…

Val編程-val系列編程思想

利用Val語言可以編寫出各種各樣的應用程序。正如windows phone面臨的窘境一樣&#xff0c;受眾太小&#xff0c;市場不大。應用程序不多&#xff0c;所以也談不上成熟。國內的應用程序基本上就是簡單的小程序&#xff0c;談不上什么編程思想。國外許多都是基于kernel的而衍生出…

Celery的實踐指南

Celery的實踐指南celery原理&#xff1a;celery實際上是實現了一個典型的生產者-消費者模型的消息處理/任務調度統&#xff0c;消費者(worker)和生產者(client)都可以有任意個&#xff0c;他們通過消息系統&#xff08;broker&#xff09;來通信。典型的場景為&#xff1a;客戶…

【pyqt5學習】——bug修復,利用qt資源庫qrc文件進行背景圖像設置,不顯示圖像

目錄 bug描述 bug分析 bug解決 bug描述 利用下面文章的方法進行資源設置后&#xff0c;有的顯示了有的沒有顯示 【pyqt5學習】——pyqt5中.qrc資源文件的創建與編寫_有情懷的機械男的博客-CSDN博客_python qrc目錄一、說明二、安裝pyqt5以及相關工具&#xff08;pyqt5、pyuic…

Datalore:用于機器學習可視化的新Web方案!

前不久&#xff0c;JetBrains團隊發布了Datalore&#xff0c;這是一款基于云的web應用程序&#xff0c;用于構建機器學習模型并在Python中創建豐富的可視化。最新的測試版本旨在簡化構建機器學習模型的流程&#xff0c;并幫助開發人員進行數據分析。由于Datalore的智能編碼輔助…

Val3語言介紹

Val3語言是一門專門針對特定工業機器人的一門語言。在墻內有關這方面的介紹非常的少。在墻外維基百科上有一篇詳細介紹的,有空FQ摘抄在這里。 Val3是使用XML格式。可以使用XML編輯器來進行編寫VAL3的程序&#xff0c;可直接在模擬器上或者示教盒上編程&#xff0c;一般推薦使用…

網絡層相關問題

1.說一下網絡層的總體結構。 2.有沒有看過源碼&#xff1f; A.繼承Request   B.打日志   C.修改參數 3.說一下Volley整體結構。 4.有了解過OkHttp嗎&#xff1f; 5.說一下OkHttp和Volley的區別&#xff1f;轉載于:https://www.cnblogs.com/jarvisyin/p/6389553.html

CSS魔法堂:重拾Border之——圖片作邊框

前言 當CSS3推出border-radius屬性時我們是那么欣喜若狂啊&#xff0c;一想到終于不用再添加額外元素來模擬圓角了&#xff0c;但發現border-radius還分水平半徑和垂直半徑&#xff0c;然后又發現border-top-left/right-radius的水平半徑之和大于元素寬度時&#xff0c;實際值會…

共享內存簡介和mmap 函數

一、共享內存簡介 共享內存區是最快的IPC形式&#xff0c;這些進程間數據傳遞不再涉及到內核&#xff0c;換句話說是進程不再通過執行進入內核的系統調用來傳遞彼此的數據。 即每個進程地址空間都有一個共享存儲器的映射區&#xff0c;當這塊區域都映射到相同的真正的物理地址空…

【pyqt5學習】——QToolTip,QLabel控件,伙伴關系

目錄 0、學習資源 1、給控件設置提示信息——QToolTip 2、QLabel控件&#xff08;顯示圖像、設置超鏈接、信號綁定&#xff09; 3、QLabel伙伴關系 1&#xff09;代碼 2&#xff09;效果 3&#xff09;知識點addWidget 0、學習資源 PyQt5教程&#xff0c;來自網易云課堂…

Hello IT

從高中的計算機課開始學習如何按下開機鍵&#xff0c;如何上網&#xff0c;如何背誦五筆字根&#xff0c;再到大學中如何使用office,利用C編碼做算法&#xff0c;到現在IT中的偽一員&#xff0c;時間算起來也不短&#xff0c;然正在入門是在2010年8月杭州參加嵌入式培訓&#x…

ARM指令集2

ARM指令集2 ARM微處理器支持加載/存儲指令用于在寄存器和存儲器之間傳送數據&#xff0c;加載指令用于將存儲器中的數據傳送到寄存器&#xff0c;存儲指令則完成相反的操作。 LDR指令&#xff08;與MOV有區別&#xff0c;MOV只能操作通用寄存器&#xff09; LDR指令格式為&…

SylixOS中select原理及使用分析

2019獨角獸企業重金招聘Python工程師標準>>> 1. select接口簡介 1.1 select接口使用用例 select是操作系統多路I/O復用技術實現的方式之一。 多路I/O復用技術大致使用場景為&#xff1a;構造一張感興趣的文件描述符列表&#xff0c;然后調用多路復用的IO接口&#x…

【pyqt5學習】——QLineEdit學習(回顯模式)

目錄 1、回顯模式 2、成果顯示 3、知識點 1&#xff09;FormLayout布局添加addRow方法 2&#xff09;在輸入框顯示灰色提示字體&#xff0c;輸入內容時消失setPlaceholderText 3&#xff09;設置回顯模式setEchoMode 4、完整代碼 1、回顯模式 QLineEdit控件的主要功能是輸…

有關機械手臂控制中的兩個重要輸入參數

1.在機械手臂中有兩個重要參數。一個是編碼器的值&#xff0c;另外一個是馬達的電流值。根據這兩個可以獲得機械手臂的運動學&#xff0c;動力學的一些數據。第一重要特征參數 是DH參數&#xff0c;另外一個就是每個軸的質心參數。