设计模式05——代理模式


1.定义

代理对象控制着对于原对象的访问,并允许在原对象的访问前后进行自定义处理。


2.实现方式

抽象接口

// 抽象接口
public interface ISubject {
    void save();
}

//抽象接口真实实现
public class SubjectImpl implements ISubject{
    @Override
    public void save() {
        System.out.println("处理业务逻辑");
    }
}

2.1 静态代理

public class SubjectProxy implements ISubject{

    private final SubjectImpl subjectImpl;

    public SubjectProxy(SubjectImpl subjectImpl) {
        this.subjectImpl = subjectImpl;
    }

    @Override
    public void save() {
        System.out.println("代理前置处理");
        subjectImpl.save();
        System.out.println("代理后置处理");
    }

	// 测试方法
    public static void main(String[] args) {
        SubjectImpl subject = new SubjectImpl();
        SubjectProxy subjectProxy = new SubjectProxy(subject);
        subjectProxy.save();
    }
}

2.2 jdk动态代理

public class JdkProxyFactory {
    private final Object target;

    public JdkProxyFactory(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("代理前置处理");
                        Object object = method.invoke(target,args);
                        System.out.println("代理后置处理");
                        return object;
                    }
                }
        );
    }

    public static void main(String[] args) {
        ISubject subject = new SubjectImpl();
        ISubject proxy = (ISubject) new JdkProxyFactory(subject).getProxyInstance();
        proxy.save();
    }
}

2.3 cglib动态代理

由于jdk动态代理的目标类限制必须实现一个或多个接口,所以cglib算是对jdk动态代理的补充,cglib动态代理不需要目标类实现接口。


// 1.实现MethodInterceptor接口
public class CglibProxyFactory implements MethodInterceptor {

    // 2.生成cglib动态代理类方法
    public Object getTargetProxy(Object target) {
        // Enhancer增强器,创建代理类
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    /**
     * callback回调方法
     *
     * @param obj    "this", the enhanced object
     * @param method intercepted Method
     * @param args   argument array; primitive types are wrapped
     * @param proxy  used to invoke super (non-intercepted method); may be called
     *               as many times as needed
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("代理前置处理");
        Object object = proxy.invokeSuper(obj, args);
        System.out.println("代理后置处理");
        return object;
    }

    public static void main(String[] args) {
        SubjectImpl target = new SubjectImpl();
        SubjectImpl targetProxy = (SubjectImpl) new CglibProxyFactory().getTargetProxy(target);
        targetProxy.save();
    }
}

3.总结

主要用于对目标对象的功能的额外操作,比如日志记录,防火墙保护,白名单等功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值