動(dòng)態(tài)代理機(jī)制的設(shè)計(jì)的目的是解耦庙楚,在很多類中,一個(gè)函數(shù)需要重復(fù)寫趴樱,如果每個(gè)類中都有該函數(shù)馒闷,造成代碼的耦合,單獨(dú)提出來之后叁征,這個(gè)時(shí)候很多類可以直接調(diào)用纳账,則這幾個(gè)類又和特定的方法耦合了,可以用動(dòng)態(tài)代理解耦合捺疼;
jdk的動(dòng)態(tài)代理只能為接口創(chuàng)建動(dòng)態(tài)代理疏虫;
newProxyInstance方法,直接可以創(chuàng)建一個(gè)動(dòng)態(tài)代理對(duì)象啤呼,該代理對(duì)象的實(shí)現(xiàn)類實(shí)現(xiàn)了interfaces指定的系列接口议薪,執(zhí)行動(dòng)態(tài)代理對(duì)象的每個(gè)方法時(shí)都會(huì)被替換執(zhí)行InvocationHandle對(duì)像的invoke方法
在該程序中,Dog是個(gè)接口媳友,接口中有三個(gè)方法斯议,傳統(tǒng)方法中,創(chuàng)建一個(gè)Dog對(duì)象時(shí)候需要new Dog()的形勢(shì)才能創(chuàng)建出來醇锚,現(xiàn)在通過動(dòng)態(tài)代理機(jī)制哼御,直接創(chuàng)建一個(gè)動(dòng)態(tài)代理對(duì)象出來,通過
Dog dog = new GunDog();
Dog dog1 = (Dog) MyProxyFactory.getProxy(dog);
//執(zhí)行具體方法的時(shí)候都會(huì)去調(diào)用IncocationHandler中的invoke()方法焊唬,可以在invoke()方法中定義一些其他方法實(shí)現(xiàn)其他方法
dog1.info();//直接調(diào)用
dog1.run();//直接調(diào)用
dog1.bark("哈哈");