C# 匯出pdf(瀏覽器不預覽直接下載)
阿新 • • 發佈:2020-12-14
技術標籤:設計模式
為什麼要有這個模式
比方說你要看一個內容,看這個內容前要審批一下你是不是機器人,這個時候審批的功能就需要代理模式,代理模式也有修飾原來類的感覺。
1.靜態代理
靜態代理沒啥說的,就是新建一個類繼承要被修飾的類,然後增加一些附加功能
2.動態代理
一會還要介紹一個cglib代理,動態代理的類必須要實現一個介面類,這是兩者的區別
public interface ITeacher {
public void teach();
public void sayHello(String name);
}
public class Teacher implements ITeacher {
@Override
public void teach() {
System.out.println("-----開始上課----");
}
@Override
public void sayHello(String name) {
System.out.println("hello" + name);
}
}
重要程式碼
需要被代理類的 class interfaces 還要 弄一個匿名的invocationhanler 去 呼叫 函式
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("開始代理");
Object returnVal = method.invoke(target,args);
return returnVal;
}
});
}
}
cglib代理 不需要 實現介面
首先 新增maven依賴
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
然後寫一個被代理物件
public class TeacherDao {
public void teach()
{
System.out.println("老師授課中 ,我是cglib代理不需要實現介面");
}
}
然後呼叫包代理一下
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class ProxyFactory implements MethodInterceptor {
private Object target;
public ProxyFactory(Object target) {
this.target = target;
}
public Object getProxyInstance()
{
//1,.建立工具類
Enhancer enhancer = new Enhancer();
//2.設定父類
enhancer.setSuperclass(target.getClass());
//3.建立回撥函式
enhancer.setCallback(this);
//4.建立子類物件,即代理物件
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib代理模式開始");
Object returnValue = method.invoke(target, objects);
System.out.println("cglib代理物件提交");
return returnValue;
}
}
綜上,希望對大家有幫助