- 什麼是代理模式 ?
- 有幾種代理模式,代碼實現
- 代理模式 和 裝飾模式的區別
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方法 )