??代理模式提供了對對象的另外一種訪問方式,即通過代理對象訪問目標(biāo)對象。當(dāng)不能或不想直接訪問目標(biāo)對象時(shí),就可以使用代理模式。代理模式實(shí)現(xiàn)的關(guān)鍵是代理對象與目標(biāo)對象。代理對象是對目標(biāo)對象的擴(kuò)展,并且會調(diào)用目標(biāo)對象。
1.靜態(tài)代理
靜態(tài)代理需要目標(biāo)對象和代理對象實(shí)現(xiàn)相同的接口或者相同的父類
示例:
//目標(biāo)接口
package proxy;
public interface IAnimalDao {
public void run();
}
//目標(biāo)類
package proxy;
public class DogDao implements IAnimalDao{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("dog run......");
}
}
//代理類
package proxy;
public class ProxyDao implements IAnimalDao{
private IAnimalDao target;
public ProxyDao(IAnimalDao target) {
this.target=target;
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("開始事務(wù)");
//
target.run();
System.out.println("提交事務(wù)");
}
}
//測試類
package proxy;
public class StaticProxyDemo {
public static void main(String args[]) {
DogDao dogDao=new DogDao();
IAnimalDao proxy=new ProxyDao(dogDao);
proxy.run();
}
}
輸出:
開始事務(wù)
dog run......
提交事務(wù)
總結(jié):靜態(tài)代理需要代理對象也實(shí)現(xiàn)和目標(biāo)對象相同的接口,當(dāng)目標(biāo)對象修改時(shí),需要同時(shí)維護(hù)代理對象
2.動態(tài)代理
動態(tài)代理不需要實(shí)現(xiàn)和目標(biāo)對象一樣的接口。jdk中提供了api用于構(gòu)建代理對象
示例:
//目標(biāo)接口
package proxy;
public interface IAnimalDao {
public void run();
}
//目標(biāo)對象
package proxy;
public class DogDao implements IAnimalDao{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("dog run......");
}
}
//產(chǎn)生代理類實(shí)例
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DogProxy {
private Object target;
public DogProxy(Object target) {
this.target=target;
}
public Object getProxyInstance() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("開始事務(wù)");
Object value=method.invoke(target, args);
System.out.println("提交事務(wù)");
return value;
}
});
}
}
//測試類
package proxy;
public class DynamicProxyDemo {
public static void main(String args[]) {
IAnimalDao target=new DogDao();
IAnimalDao proxy=(IAnimalDao) new DogProxy(target).getProxyInstance();
proxy.run();
}
}
輸出:
開始事務(wù)
dog run......
提交事務(wù)
總結(jié):代理對象不需要實(shí)現(xiàn)接口,但目標(biāo)對象一定要實(shí)現(xiàn)接口,不然不能使用jdk動態(tài)代理