代理模式也殖,側(cè)重于對某一事物的具體方面的實現(xiàn)忆嗜,代理可能是對象本身崎岂,但代理和對象不完全相同
這里使用到編程中的一個思想:不要隨意去修改別人已經(jīng)寫好的代碼或者方法,如果需改修改,可以通過代理的方式來擴(kuò)展該方法
一,靜態(tài)代理
- 可以做到在不修改目標(biāo)對象的功能前提下,對目標(biāo)功能擴(kuò)展
- 因為代理對象需要與目標(biāo)對象實現(xiàn)一樣的接口,所以會有很多代理類,類太多
- 同時,一旦接口增加方法,目標(biāo)對象與代理對象都要維護(hù)
public class UserProxy implements IUserDao {
private IUserDao mUser;
public UserProxy(IUserDao user){
mUser = user;
}
@Override
public void add(User user) {
mUser.add(user);
}
@Override
public void delete(int id) {
mUser.delete(id);
}
@Override
public void update(int id) {
mUser.update(id);
}
@Override
public void quey(int id) {
mUser.quey(id);
}
}
二绩卤,動態(tài)代理
- 代理對象,不需要實現(xiàn)接口
- 代理對象的生成,是利用JDK的API,動態(tài)的在內(nèi)存中構(gòu)建代理對象(需要我們指定創(chuàng)建代理對象/目標(biāo)對象實現(xiàn)的接口的類型)
- 動態(tài)代理也叫做:JDK代理,接口代理
- JDK中生成代理對象的API
- 代理類所在包:java.lang.reflect.Proxy
- 目標(biāo)對象實現(xiàn)的接口的類型,使用泛型方式確認(rèn)類型
- 使用了反射機(jī)制,對性能會造成影響
代碼簡單示例:
public class DynamicPorxy {
private Object target;
public DynamicPorxy(Object target) {
this.target = target;
}
//給目標(biāo)對象生成代理對象給目標(biāo)對象生成代理對象
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 {
Object value = method.invoke(target, args);
return value;
}
});
}
}