Java增強:靜態代理與動態代理

  1. 什麼是代理模式 ?
  2. 有幾種代理模式,代碼實現
  3. 代理模式 和  裝飾模式的區別

part1: 代理模式的概念

 

代理模式: 不改變源碼的情況下,實現對目標對象的功能擴展,對代理的對象施加控制,並不提供對象本身的增強功能(裝飾模式爲所裝飾的對象增強功能,組織結構類似於靜態代理, 但‘同途 梳歸’, 兩個目的不同)


part2: 代碼實現(動態代理)

A, 定義接口

interface Person {
    void say(String name);

    void sleep();
}

interface Work {
    void work();
}

B, 定義接口實現類

class P1 implements Person, Work{

    @Override
    public void say(String name) {
        System.out.println("hello "+ name);
    }

    @Override
    public void sleep() {
        System.out.println("sleep....");
    }

    @Override
    public void work() {
        System.out.println("work.....");
    }
}

C, 1-----代理實現類:自定義方法增強類InvocationHandler

 public InvocationHandler createHandler() {
        //對象: 接口實現類
        final P1 p1 = new P1();

        // 處理器
        InvocationHandler handler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object res = null;

                //方法增強: 前後控制
                if (method.getName().equals("sleep")) {
                    System.out.println();
                    System.out.println("----------handler  before--- 增強sleep ..");
                    res = method.invoke(p1, args);
                    System.out.println("----------handler  after---增強sleep ..\n");

                } else if (method.getName().equals("say")) {
                    System.out.println("=========");

                    Person p = (Person) proxy;
                    p.sleep();

                    System.out.println("*********handler  before---增強say ..");
                    res = method.invoke(p1, args);
                    System.out.println("*********handler  after---增強say ..");

                    System.out.println("=========");

                } else {//不增強方法
                    res = method.invoke(p1, args);
                }
                return res;
            }
        };

        //返回: 接口實現類
        return handler;
    }

    2------調用Proxy的靜態方法: 創建代理對象

@Test
    public void newInstance() {
        // 代理工具類Proxy :創建對象 ( 接口,  處理器)
        Object obj = Proxy.newProxyInstance(

                ProTest.class.getClassLoader(),
                new Class[]{Person.class, Work.class},
                createHandler()
        );
        Person person = (Person) obj;
        person.say("lilsi");

        // 代理類: 創建對象
        Work worker = (Work) obj;
        worker.work();
    }

測試結果:動態控制原生對象方法的調用(對原對象--增強say方法,   原生調work方法 )

 

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