摘要:實(shí)現(xiàn)數(shù)據(jù)庫操作關(guān)于人員的數(shù)據(jù)庫操作定義一個(gè)代理類代理,如果使用靜態(tài)代理,那么這個(gè)類必須實(shí)現(xiàn)接口,這里采用動(dòng)態(tài)代理類,免去實(shí)現(xiàn)代理類定義的所有接口。
描述:代理對象和被代理對象具有相同的行為,客戶端通過代理對象實(shí)現(xiàn)對被代理對象調(diào)用,代理對象除了可以代理被代理對象的所有行為外,還可以在被代理對象的所有行為上添加一些額外的內(nèi)容,如開閉事務(wù),權(quán)限攔截等;動(dòng)態(tài)代理可以生成一個(gè)不用實(shí)現(xiàn)被代理類的所有接口的代理類,它內(nèi)部通過被代理類的classLoader和反射機(jī)制實(shí)現(xiàn)被代理類的所有接口。。
場景:在數(shù)據(jù)庫操作中,假如所有增刪改查操作都需要加log記錄,可以代理這個(gè)數(shù)據(jù)庫操作,然后在運(yùn)行這些增刪改查操作時(shí)加一個(gè)log記錄,客戶端使用方式仍然不變。
實(shí)現(xiàn):
數(shù)據(jù)庫操作:
interface Dao { void insert(); void delete(); }
關(guān)于人員的數(shù)據(jù)庫操作:
class UserDao implements Dao { @Override public void insert() { System.out.println("insert user instance to db!"); } @Override public void delete() { System.out.println("delete user instance from db!"); } }
定義一個(gè)代理類代理UserDao,如果使用靜態(tài)代理,那么這個(gè)類必須實(shí)現(xiàn)Dao接口,這里采用動(dòng)態(tài)代理類,免去實(shí)現(xiàn)代理類定義的所有接口。
class UserDaoProxy implements InvocationHandler { Dao dao; UserDaoProxy(Dao dao) { this.dao = dao; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { before(); Object result = method.invoke(dao, args); after(); return result; } private void before() { System.out.println("開始log..."); } private void after() { System.out.println("結(jié)束log"); } }
客戶端調(diào)用:
public class ProxyDemo { public static void main(String[] args) { UserDaoProxy proxy = new UserDaoProxy(new UserDao()); Dao dao = (Dao)Proxy.newProxyInstance(UserDao.class.getClassLoader(), UserDao.class.getInterfaces(), proxy); dao.insert(); dao.delete(); } }
打印結(jié)果:
開始log...
insert user instance to db!
結(jié)束log
開始log...
delete user instance from db!
結(jié)束log
結(jié)論:通過代理類即能保持原接口調(diào)用不變,還能對接口調(diào)用的前后增加額外的業(yè)務(wù)代碼,甚至可以改變接口的實(shí)現(xiàn),why?想想現(xiàn)實(shí)中的代理就知道了。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64007.html
摘要:動(dòng)態(tài)代理又被稱為代理或接口代理。靜態(tài)代理在編譯時(shí)產(chǎn)生字節(jié)碼文件,可以直接使用,效率高。代理無需實(shí)現(xiàn)接口,通過生成類字節(jié)碼實(shí)現(xiàn)代理,比反射稍快,不存在性能問題,但會(huì)繼承目標(biāo)對象,需要重寫方法,所以目標(biāo)對象不能為類。 一、代理模式介紹 代理模式是一種設(shè)計(jì)模式,提供了對目標(biāo)對象額外的訪問方式,即通過代理對象訪問目標(biāo)對象,這樣可以在不修改原目標(biāo)對象的前提下,提供額外的功能操作,擴(kuò)展目標(biāo)對象的功...
摘要:代理模式概念代理模式分為兩種,一種是靜態(tài)代理模式,一種是動(dòng)態(tài)代理模式。面向切面的編程也是使用動(dòng)態(tài)代理模式來實(shí)現(xiàn)的。 1.代理模式概念 代理模式分為兩種,一種是靜態(tài)代理模式,一種是動(dòng)態(tài)代理模式。 靜態(tài)代理模式:在程序運(yùn)行之前需要寫好代理類 動(dòng)態(tài)代理模式:在程序運(yùn)行期間動(dòng)態(tài)生成代理類 2.動(dòng)態(tài)代理的實(shí)現(xiàn) 動(dòng)態(tài)代理實(shí)現(xiàn)的步驟: (1)寫一個(gè)代理類SubjectHandler實(shí)現(xiàn)Invoca...
摘要:代理模式基本概念不論是靜態(tài)代理還是動(dòng)態(tài)代理其本質(zhì)都是代理模式的一種實(shí)現(xiàn)那么什么是代理模式呢代理模式即給某一個(gè)對象提供一個(gè)代理并由代理對象控制對原對象的引用代理模式其實(shí)取材于實(shí)際生活例如我們生活中常見的房屋租賃代理我們在租房時(shí)一般不是直接和房 代理模式 基本概念 不論是靜態(tài)代理還是動(dòng)態(tài)代理, 其本質(zhì)都是代理模式的一種實(shí)現(xiàn), 那么什么是代理模式呢?代理模式, 即給某一個(gè)對象提供一個(gè)代理, ...
摘要:簡介代理模式委托模式就是使用代理對象來訪問目標(biāo)對象這樣可以在目標(biāo)對象執(zhí)行前后來做一些邏輯處理這里使用到編程中的一個(gè)思想不要隨意去修改別人已經(jīng)寫好的代碼或者方法如果需改修改可以通過代理的方式來擴(kuò)展該方法代理模式通用類圖設(shè)計(jì)模式之禪文中提到為其 簡介 代理模式(委托模式)就是使用代理對象來訪問目標(biāo)對象, 這樣可以在目標(biāo)對象執(zhí)行前后, 來做一些邏輯處理. 這里使用到編程中的一個(gè)思想:不要隨意...
時(shí)間:2017年08月28日星期一說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:代理模式 1-1 概念介紹 學(xué)習(xí)本課程基礎(chǔ) 面向?qū)ο蟮脑O(shè)計(jì)思維 了解多態(tài)的概念 了解反射機(jī)制 課程目標(biāo) 代理模式基本概念及分類...
摘要:本文首發(fā)于作者最近在學(xué),研究了下和代理模式,寫點(diǎn)心得和大家分享下。所以下面來重點(diǎn)分析下代理模式。這里代理模式分為靜態(tài)代理和動(dòng)態(tài)代理兩種,我們分別來看下。代理模式,代理,意味著有一方代替另一方完成一件事。 本文首發(fā)于 https://jaychen.cc作者 jaychen 最近在學(xué) Spring,研究了下 AOP 和代理模式,寫點(diǎn)心得和大家分享下。 AOP 先說下AOP,AOP 全稱 ...
閱讀 711·2021-11-22 13:54
閱讀 3077·2021-09-26 10:16
閱讀 3505·2021-09-08 09:35
閱讀 1585·2019-08-30 15:55
閱讀 3435·2019-08-30 15:54
閱讀 2082·2019-08-30 10:57
閱讀 502·2019-08-29 16:25
閱讀 883·2019-08-29 16:15