Java 设计模式之代理模式

代理模式:为其他对象提供一种代理以控制这个对象的访问。
代理模式根据用途来划分

  • 远程代理:也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
  • 虚拟代理:是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。(浏览器加载图片)
  • 安全代理:用来控制真实对象访问时的权限。
  • 智能指引:当调用真实对象时,代理处理另外一些事。

在Java中我们都是按代理的实现方式来划分代理,下面我们根据详细的例子来分析一下代理模式。

  • 静态代理:静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类。
interface IUser{
    void sing();
}
public void XiaoHua implements IUser{
    public void sing(){
        System.out.println("一笑倾城,一见难忘");
    }
} 
class ProxyUser implements IUser{
     // 接收保存目标对象
    private IUser target;
    public ProxyUser(IUser target){
        this.target=target;
    }
    public void save() {
        System.out.println("开始事务,可以做点坏事...");
        target.save();//执行目标对象的方法
        System.out.println("提交事务,还能干点坏事...");
    }
}
//总结:静态代理实现简单,但是不灵活,需要继承相同的基类,可维护性差。
  • 动态代理:代理对象不需要与目标对象实现相同的接口;代理对象是JDK动态构建生成的;目标对象需要有实现接口。
/**
 * 创建动态代理对象
 * 动态代理不需要实现接口,但是需要指定接口类型
 */
public 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("开始事务2");
                        //执行目标对象方法
                        Object returnValue = method.invoke(target, args);
                        System.out.println("提交事务2");
                        return returnValue;
                    }
                }
        );
    }
}
  • cglib代理:也叫作子类代理,它不需要在目标对象实现任何接口也能生成代理对象,它是在内存中构建一个子类对象从而实现对目标对象功能的扩展。
/**
 * Cglib子类代理工厂
 * 对UserDao在内存中动态构建一个子类对象
 */
public class ProxyFactory implements MethodInterceptor{
    //维护目标对象
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    //给目标对象创建一个代理对象
    public Object getProxyInstance(){
        //1.工具类
        Enhancer en = new Enhancer();
        //2.设置父类
        en.setSuperclass(target.getClass());
        //3.设置回调函数
        en.setCallback(this);
        //4.创建子类(代理对象)
        return en.create();

    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("开始事务...");

        //执行目标对象的方法
        Object returnValue = method.invoke(target, args);

        System.out.println("提交事务...");

        return returnValue;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值