举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理人(经纪人)来解决。
代理模式的关键点是:代理对象与目标对象.代理对象是对目标对象的扩展,并会调用目标对象。
在其中,经纪人即扩展了明星的功能,又可以调用明星的方法。
有三种代理方式:静态代理,动态代理,cglib代理。
静态代理
package designParttern;
public class Proxy {
public static void main(String[] args) {
Star star = new Star();
Agent agent = new Agent(star);
agent.save();
}
}
interface IUserDao{
void save();
}
class Star implements IUserDao{
@Override
public void save() {
System.out.println("我是明星 要开始唱歌了");
}
}
class Agent implements IUserDao{
private Star star;
public Agent(Star star){
this.star = star;
}
@Override
public void save() {
System.out.println("经纪人说话");
System.out.println("演唱会前置发布会");
star.save();
System.out.println("演唱会后置发布会");
}
}优点:可以做到在不修改目标对象的功能前提下,对目标功能扩展.
缺点: 因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护.
如何解决静态代理中的缺点呢?答案是可以使用动态代理方式。
动态代理
package designParttern;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DymaticProxyMain {
public static void main(String[] args) {
UserService target = new UserServiceImpl();//创建一个明星对象
ProxyFactory proxyFactory = new ProxyFactory(target);
UserService userService = (UserService) proxyFactory.getProxyInstance();
userService.sing();
}
}
//一个代理类 有一个生成代理对象的方法 和 利用invocation的方法
class ProxyFactory{
private Object target;
public ProxyFactory(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 {
System.out.println("begin");
Object retuanVal = method.invoke(target,args);
System.out.println("end");
return retuanVal;
}
});
}
}
interface UserService{
void sing();
}
class UserServiceImpl implements UserService{
@Override
public void sing() {
System.out.println("star is singing !");
}
}
cglib代理
168万+

被折叠的 条评论
为什么被折叠?



