java23种设计模式之五:代理模式
一.代理模式介紹
?? 代理模式的定義:就是為一個(gè)接品(對(duì)象)提供一個(gè)代理的對(duì)象,并由這個(gè)代理對(duì)象控制對(duì)原對(duì)象的訪問(wèn)流程
其中代理又分為:靜態(tài)代理和動(dòng)態(tài)代理
? 靜態(tài)代理:指的是自己要寫(xiě)一個(gè)代理類(lèi),或者用工具生成一個(gè)代理類(lèi),總之就是程序運(yùn)行之前已經(jīng)存且編譯好的代理類(lèi).(自己寫(xiě)的類(lèi))
動(dòng)態(tài)代理:指由JVM虛擬機(jī)程序運(yùn)行時(shí)產(chǎn)生的代理類(lèi)。(jvm或第三方生成的類(lèi))
動(dòng)態(tài)類(lèi)具有更強(qiáng)的靈活性,它不用在我們?cè)O(shè)計(jì)實(shí)現(xiàn)類(lèi)時(shí)指定哪個(gè)類(lèi)被代理了。
二.動(dòng)態(tài)代理
覆蓋InvocationHandler接口中的invoke()方法,更重要的是,動(dòng)態(tài)代理模式可以使得我們?cè)诓桓淖冊(cè)瓉?lái)已有的代碼結(jié)構(gòu)的情況下,對(duì)原來(lái)的原有進(jìn)行擴(kuò)展、增強(qiáng)其功能,并且可以達(dá)到控制被代理對(duì)象的行為。
每一個(gè)動(dòng)態(tài)代理類(lèi)都必須要實(shí)現(xiàn)InvocationHandler這個(gè)接口,并且每個(gè)代理類(lèi)的實(shí)例都關(guān)聯(lián)到了一個(gè)handler,當(dāng)我們通過(guò)代理對(duì)象調(diào)用一個(gè)方法的時(shí)候,這個(gè)方法的調(diào)用就會(huì)被轉(zhuǎn)發(fā)為由InvocationHandler這個(gè)接口的 invoke 方法來(lái)進(jìn)行調(diào)用。
public class DynamicProxy implements InvocationHandler{// 被代理類(lèi)的實(shí)例 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; //花費(fèi)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 +"錢(qián)買(mǎi)車(chē)");}}動(dòng)態(tài)代理測(cè)試類(lèi)
public class MainTest {public static void main(String[] args) {User user = new User("張三",1000);InvocationHandler handler = new DynamicProxy(user);/*** 每一個(gè)動(dòng)態(tài)代理類(lèi)都必須要實(shí)現(xiàn)InvocationHandler這個(gè)接口,并且每個(gè)代理類(lèi)的實(shí)例都關(guān)聯(lián)到了一個(gè)handler,當(dāng)我們通過(guò)代理對(duì)象調(diào)用一個(gè)方法的時(shí)候,這個(gè)方法的調(diào)用就會(huì)被轉(zhuǎn)發(fā)為由InvocationHandler這個(gè)接口的 invoke 方法來(lái)進(jìn)行調(diào)用。我們來(lái)看看InvocationHandler這個(gè)接口的唯一一個(gè)方法 invoke 方法:* Proxy.newProxyInstance 3個(gè)參數(shù)的意思:* handler.getClass().getClassLoader() : 獲取代理類(lèi)的加載 器來(lái)加載動(dòng)態(tài)代理類(lèi)對(duì)象* user.getClass().getInterfaces() : 該對(duì)象的方法就是代理類(lèi)所代理的方法* handler : InvocationHandler 對(duì)象*/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种设计模式之五:代理模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mac重装系统全盘格式化的方法
- 下一篇: .Net 面试