1. 程式人生 > >動態代理模式和責任鏈模式

動態代理模式和責任鏈模式

代理:即中介的意思,比如客戶,公司產品經理,軟體工程師之間的管理。產品經理為代理者,軟體工程師為被代理者。回到程式碼中,客戶就是主程式,軟體工程師就是切面程式1.最常用的代理技術有兩種:JDK(jdk自帶)和CGLIB(第三方提供的技術)。spring常用jdk和cglib,mybatis用Javassist。

2.JDK中我們必須使用介面(定義一個介面然後去實現這個介面),cglib不需要(更簡單一點)

3.JDK代理中要實現代理邏輯類就必須去實現java.lang.reflect.InvocationHandler介面,他裡面定義了一個invoke方法,並提供介面陣列用於下掛代理物件。

例子如下

3.1定義被代理物件(真是物件)

3.11:介面

public interface HelloWorld {
public void sayHello(String name, int age);
public void getResult(String name);
}

3.12:介面實現類:

public class HelloWorldImp implements HelloWorld {
@Override
public void sayHello(String name, int age) {
// TODO Auto-generated method stub
System.out.println("我是" + name + "我" + age);
}


@Override
public void getResult(String name) {
System.out.println("我是" + name);
}


}

3.2:代理繫結和代理邏輯實現

public class JdkExample implements InvocationHandler {
private Object target = null;

//繫結,傳入一個被代理物件,輸出一個代理物件
public Object bind(Object target) {
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}

//設定代理邏輯
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("開始了");
Object object = method.invoke(target, args);
System.out.println("結束了");
return object;
}


}

//測試:

public class TestJdk {
public static void main(String[] args) {
JdkExample jdk = new JdkExample();
HelloWorld h = (HelloWorld) jdk.bind(new HelloWorldImp());
h.sayHello("lg", 25);
}


}

4.CGLIB動態代理

和jdk類似,但是需要匯入架包,參考22頁