Java中靜態(tài)代理的使用與原理詳解
概述
代理模式是為一個(gè)對(duì)象提供一個(gè)替身,以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。即通過(guò)代理對(duì)象訪問(wèn)目標(biāo)對(duì)象.這樣做的好處是:可以在目標(biāo)對(duì)象實(shí)現(xiàn)的基礎(chǔ)上,增強(qiáng)額外的功能操作,即擴(kuò)展目標(biāo)對(duì)象的功能。
被代理的對(duì)象可以是遠(yuǎn)程對(duì)象、創(chuàng)建開(kāi)銷大的對(duì)象或需要安全控制的對(duì)象
代理模式有不同的形式, 主要有三種靜態(tài)代理、動(dòng)態(tài)代理(JDK 代理、接口代理)和Cglib 代理(可以在內(nèi)存 動(dòng)態(tài)的創(chuàng)建對(duì)象,而不需要實(shí)現(xiàn)接口, 他是屬于動(dòng)態(tài)代理的范疇) 。
靜態(tài)代理在使用時(shí),需要定義接口或者父類,被代理對(duì)象(即目標(biāo)對(duì)象)與代理對(duì)象一起實(shí)現(xiàn)相同的接口或者是繼承相同父類。
應(yīng)用案例
① 代碼實(shí)現(xiàn)
具體要求
- 定義一個(gè)接口:ITeacherDao
- 目標(biāo)對(duì)象TeacherDAO 實(shí)現(xiàn)接口ITeacherDAO
- 使用靜態(tài)代理方式,就需要在代理對(duì)象TeacherDAOProxy 中也實(shí)現(xiàn)ITeacherDAO
- 調(diào)用的時(shí)候通過(guò)調(diào)用代理對(duì)象的方法來(lái)調(diào)用目標(biāo)對(duì)象.
- 特別提醒:代理對(duì)象與目標(biāo)對(duì)象要實(shí)現(xiàn)相同的接口,然后通過(guò)調(diào)用相同的方法來(lái)調(diào)用目標(biāo)對(duì)象的方法
public interface ITeacherDao { void teach(); // 授課的方法 } public class TeacherDao implements ITeacherDao { @Override public void teach() { System.out.println(" 老師授課中 。。。。。"); } } //代理對(duì)象,靜態(tài)代理 public class TeacherDaoProxy implements ITeacherDao{ private ITeacherDao target; // 目標(biāo)對(duì)象,通過(guò)接口來(lái)聚合 //構(gòu)造器 public TeacherDaoProxy(ITeacherDao target) { this.target = target; } @Override public void teach() { System.out.println("開(kāi)始代理 完成某些操作。。。。。 ");//方法 target.teach(); System.out.println("提交。。。。。");//方法 } } //測(cè)試客戶端 public class Client { public static void main(String[] args) { // TODO Auto-generated method stub //創(chuàng)建目標(biāo)對(duì)象(被代理對(duì)象) TeacherDao teacherDao = new TeacherDao(); //創(chuàng)建代理對(duì)象, 同時(shí)將被代理對(duì)象傳遞給代理對(duì)象 TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDao); //通過(guò)代理對(duì)象,調(diào)用到被代理對(duì)象的方法 //即:執(zhí)行的是代理對(duì)象的方法,代理對(duì)象再去調(diào)用目標(biāo)對(duì)象的方法 teacherDaoProxy.teach(); } }
② UML類圖
③ 靜態(tài)代理的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):在不修改目標(biāo)對(duì)象的功能前提下, 能通過(guò)代理對(duì)象對(duì)目標(biāo)功能擴(kuò)展
缺點(diǎn):因?yàn)榇韺?duì)象需要與目標(biāo)對(duì)象實(shí)現(xiàn)一樣的接口,所以會(huì)有很多代理類
一旦接口增加方法,目標(biāo)對(duì)象與代理對(duì)象都要維護(hù)
到此這篇關(guān)于Java中靜態(tài)代理的使用與原理詳解的文章就介紹到這了,更多相關(guān)Java靜態(tài)代理原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot集成RocketMQ發(fā)送事務(wù)消息的原理解析
RocketMQ 的事務(wù)消息提供類似 X/Open XA 的分布事務(wù)功能,通過(guò)事務(wù)消息能達(dá)到分布式事務(wù)的最終一致,這篇文章主要介紹了SpringBoot集成RocketMQ發(fā)送事務(wù)消息,需要的朋友可以參考下2022-06-06SpringBoot Filter修改返回內(nèi)容,解決請(qǐng)求卡死200的錯(cuò)誤
這篇文章主要介紹了SpringBoot Filter修改返回內(nèi)容,解決請(qǐng)求卡死200的錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Java網(wǎng)絡(luò)編程基礎(chǔ)用法詳解
網(wǎng)絡(luò)編程是指編寫運(yùn)行在多個(gè)設(shè)備(計(jì)算機(jī))的程序,這些設(shè)備都通過(guò)網(wǎng)絡(luò)連接起來(lái),本文將帶大家詳細(xì)了解Java的網(wǎng)絡(luò)編程,文中有相關(guān)的代碼示例,需要的朋友可以參考下2023-05-05swagger注解@ApiModelProperty失效情況的解決
這篇文章主要介紹了swagger注解@ApiModelProperty失效情況的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06Java?-jar參數(shù)詳解之掌握J(rèn)ava可執(zhí)行JAR文件的運(yùn)行技巧
做項(xiàng)目的時(shí)候我們肯定接觸過(guò)很多jar包,下面這篇文章主要給大家介紹了關(guān)于Java?-jar參數(shù)詳解之掌握J(rèn)ava可執(zhí)行JAR文件的運(yùn)行技巧,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11spring boot 添加admin監(jiān)控的方法
這篇文章主要介紹了spring boot 添加admin監(jiān)控的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02java對(duì)接支付寶支付接口簡(jiǎn)單步驟記錄
最近項(xiàng)目APP需要接入微信、支付寶支付功能,在分配開(kāi)發(fā)任務(wù)時(shí),聽(tīng)說(shuō)微信支付接口比支付寶支付接口要難實(shí)現(xiàn),這篇文章主要給大家介紹了關(guān)于java對(duì)接支付寶支付接口的簡(jiǎn)單步驟,需要的朋友可以參考下2024-05-05