1. 程式人生 > 其它 >C# 匯出pdf(瀏覽器不預覽直接下載)

C# 匯出pdf(瀏覽器不預覽直接下載)

技術標籤:設計模式

為什麼要有這個模式

比方說你要看一個內容,看這個內容前要審批一下你是不是機器人,這個時候審批的功能就需要代理模式,代理模式也有修飾原來類的感覺。

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;
    }
}

綜上,希望對大家有幫助