天天看點

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

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

part1: 代理模式的概念

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

代理模式: 不改變源碼的情況下,實作對目标對象的功能擴充,對代理的對象施加控制,并不提供對象本身的增強功能(裝飾模式為所裝飾的對象增強功能,組織結構類似于靜态代理, 但‘同途 梳歸’, 兩個目的不同)

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

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方法 )

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

繼續閱讀