代理模式的原理(靜态/動态)
代理實作:
1.靜态代理:
帶理者隻能實作一種被代理的需求
2.動态代理:
<1>可以實作針對被代理需求的多種代理
<2>需要實作 InvocationHandler接口
<3>利用反射傳入的類加載器 來改變代理方法 動态傳入代理加載類
一、靜态代理模式
//如下實作對靜态代理的測試
public class TestProxy {
`@Test
public void testStaticProxy() {
ProxyImpl im = new ProxyImpl();
Proxy2 p2=new Proxy2();
PersonProxy pp = new PersonProxy(p2);
pp.action();
}
}
//代理和被代理都實作的共同接口如下:
interface Person{
void action();
}
//代理者類實作如下:
class PersonProxy implements Person{
Person p;
public PersonProxy(Person p){
this.p=p;//将 顧客(被代理人)的資料告訴代理人
}
@Override
public void action() {
System.out.println("開始代理工作");
p.action();//執行 顧客要求的代理工作
System.out.println("結束代理工作");
}
}
//被代理者1——買車實作如下:
class ProxyImpl implements Person{
@Override
public void action() {
System.out.println("我要買" +"車");
}
}
//被代理類2代理買房實作如下:
class Proxy2 implements Person{
@Override
public void action() {
System.out.println("我要買房……");
}
}
二、動态代理實作如下:
測試代理方法:
//測試代理運作 子產品如下:
`@Test
public void testDynamicProxy() {
Person person = new Customer1();
/**
* 參數1: 代理人對象使用的類加載器 參數2:代理人對象 實作的接口 參數3: 被代理人對象
*
* */
Person p = (Person) Proxy.newProxyInstance(person.getClass()
.getClassLoader(), person.getClass().getInterfaces(),
new Clerk(person));
p.doWork();
}
}
// 包含所有代理類的工廠(類似于中介可代理多種買車 買房 ……)
class Clerk implements InvocationHandler {
Person person;// 被代理人
public Clerk(Person person) {
this.person = person;
}
/**
* 參數1:被代理對象 參數 2:被代理對象要代理的業務——買房或買車 參數 3:被代理對象要執行的方法的對應參數
*
* 傳回:代理人對象
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("-----開始代理工作------");
Object invoke = method.invoke(person, args);
System.out.println("-----結束代理工作-------");
return invoke;
}
}
//共同實作的接口
interface Person {
void doWork();
}
//被代理對象1
class Customer1 implements Person {
@Override
public void doWork() {
System.out.println("我要買車");
}
}
//被代理對象2
class Customer implements Person {
@Override
public void doWork() {
System.out.println("我要買房");
}
}