設計模式之代理模式

動態代理的概述和實現

> 動態代理概述
1.代理:本來應該自己做的事情,請了別人來做,被請的人就是代理對象。 舉例:春節回家買票讓人代買
2.在Java中java.lang.reflect包下提供了一個Proxy類和一個InvocationHandler接口
3.通過使用這個類和接口就可以生成動態代理對象。
4.JDK提供的代理只能針對接口做代理。
5.我們有更強大的代理cglib
6.Proxy類中的方法創建動態代理類對象 Proxy 通過 newProxyInstance(loader,interfaces,h)創建代理對象
InvocationHandler的invoke(proxy,method, args)方法會攔截方法的調用

package lesson.animal.proxy;

import javax.sound.midi.Soundbank;
import javax.swing.event.MouseInputAdapter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * User: 彭家琪
 * Date: 2019/9/11   19:59
 */
public class ProxyDemo {

    public static void main(String[] args) {
        UserServerImpl userServer = new UserServerImpl();
       /* userServer.registUser();
        userServer.delUser();*/

        //創建代理對象
        UserServer proxy = (UserServer) Proxy.newProxyInstance(userServer.getClass().getClassLoader(),
                userServer.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println(method);
                        System.out.println("權限校驗。。");

                        Object reoj = method.invoke(userServer, args);

                        System.out.println("日誌記錄。。");

                        return reoj;
                    }
                });
        proxy.registUser();
        proxy.delUser();
    }
}
interface UserServer{
    public void registUser();
    public void delUser();
}
class UserServerImpl implements UserServer{

    @Override
    public void registUser() {
        System.out.println("註冊用戶");
    }

    @Override
    public void delUser() {

        System.out.println("刪除用戶");
    }
}


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