設計模式之代理設計模式(動態代理類寫法)

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("創建用戶"));
    }

}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章