设计模式之代理设计模式(动态代理类写法)

package com.sjl;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理类
 */
public class DynamicProxyTest{
    public static void main(String[] args) {
        UserDao ud = (UserDao) new DynamicProxy().bind(new UserService());
        ud.findByName("李三");
        ud.doCreate(null);
    }
}

class DynamicProxy implements InvocationHandler {

    private Object target;//代理对象

    public Object bind(Object target){//由系统生成一个指定接口的代理类对象
        this.target = target;
        //返回与当前传入对象结构相同的代理类对象
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        this.log(method.getName());
        Object retObj = method.invoke(this.target,args);
        if(method.getName().matches("do[a-zA-Z0-9]+")){
            this.commit(method.getName());
        }
        return retObj;
    }

    public void log(String methodName){
        System.out.println("进行日志记录,方法:"+methodName);
    }

    public void commit(String methodName){
        System.out.println(String.format("进行事务提交,方法:%s",methodName));
    }
}

class UserService implements UserDao{

    public void findByName(String name){
        System.out.println(String.format("根据名字  %s 查找用户",name));
    }

    public void doCreate(Object obj){
        System.out.println(String.format("创建用户"));
    }

}

interface UserDao{
    void findByName(String name);
    void doCreate(Object obj);
}

该模式的限制:必须要有接口。为了解决这一问题,可以使用第三方jar:cglib包,实现基于类实现的动态代理模式
cglib包:处理动态代理设计模式

package com.sjl;


import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * cglib包:处理动态代理设计模式
 */
public class DynamicProxyCglibTest{
    public static void main(String[] args) {
       final UserService1 us = new UserService1();
        Enhancer en = new Enhancer();
        en.setSuperclass(UserService1.class);
        en.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                return methodProxy.invokeSuper(o,objects);
            }
        });
        //创建代理类
        UserService1 us1 = (UserService1)en.create();
        //调用代理类的方法
        us1.findByName("李四");
    }
}

class UserService1{

    public void findByName(String name){
        System.out.println(String.format("根据名字  %s 查找用户",name));
    }

    public void doCreate(Object obj){
        System.out.println(String.format("创建用户"));
    }

}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值