java23种设计模式之五:代理模式
一.代理模式介紹
?? 代理模式的定義:就是為一個接品(對象)提供一個代理的對象,并由這個代理對象控制對原對象的訪問流程
其中代理又分為:靜態(tài)代理和動態(tài)代理
? 靜態(tài)代理:指的是自己要寫一個代理類,或者用工具生成一個代理類,總之就是程序運行之前已經(jīng)存且編譯好的代理類.(自己寫的類)
動態(tài)代理:指由JVM虛擬機程序運行時產(chǎn)生的代理類。(jvm或第三方生成的類)
動態(tài)類具有更強的靈活性,它不用在我們設計實現(xiàn)類時指定哪個類被代理了。
二.動態(tài)代理
覆蓋InvocationHandler接口中的invoke()方法,更重要的是,動態(tài)代理模式可以使得我們在不改變原來已有的代碼結(jié)構(gòu)的情況下,對原來的原有進行擴展、增強其功能,并且可以達到控制被代理對象的行為。
每一個動態(tài)代理類都必須要實現(xiàn)InvocationHandler這個接口,并且每個代理類的實例都關(guān)聯(lián)到了一個handler,當我們通過代理對象調(diào)用一個方法的時候,這個方法的調(diào)用就會被轉(zhuǎn)發(fā)為由InvocationHandler這個接口的 invoke 方法來進行調(diào)用。
public class DynamicProxy implements InvocationHandler{// 被代理類的實例 Object proxy;public DynamicProxy(Object proxy) {this.proxy = proxy;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result = method.invoke(this.proxy, args);return null;}}public interface ProxySSSS {public void buyCar(int cash); }public class User implements ProxyInterface{private int cash; //花費private String name;public User(int cash,String name){this.cash = cash;this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getCash() {return cash;}public void setCash(int cash) {this.cash = cash;}public void buyCar() {System.out.println("花 "+cash +"錢買車");}}動態(tài)代理測試類
public class MainTest {public static void main(String[] args) {User user = new User("張三",1000);InvocationHandler handler = new DynamicProxy(user);/*** 每一個動態(tài)代理類都必須要實現(xiàn)InvocationHandler這個接口,并且每個代理類的實例都關(guān)聯(lián)到了一個handler,當我們通過代理對象調(diào)用一個方法的時候,這個方法的調(diào)用就會被轉(zhuǎn)發(fā)為由InvocationHandler這個接口的 invoke 方法來進行調(diào)用。我們來看看InvocationHandler這個接口的唯一一個方法 invoke 方法:* Proxy.newProxyInstance 3個參數(shù)的意思:* handler.getClass().getClassLoader() : 獲取代理類的加載 器來加載動態(tài)代理類對象* user.getClass().getInterfaces() : 該對象的方法就是代理類所代理的方法* handler : InvocationHandler 對象*/ProxySSSS instance = (ProxySSSS)Proxy.newProxyInstance(handler.getClass().getClassLoader(), user.getClass().getInterfaces(), handler);instance.buyCar(user.getCash());} }?
轉(zhuǎn)載于:https://www.cnblogs.com/MrRightZhao/p/10815311.html
總結(jié)
以上是生活随笔為你收集整理的java23种设计模式之五:代理模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac重装系统全盘格式化的方法
- 下一篇: 荣耀Magic5系列首发MagicOS