代理模式(proxy):
給目標對象提供一個代理對象,並由代理對象控制對目標對象的引用。
在代理模式中,代理對象和目標對象需要實現同一個接口。
IPerson.interface
package proxy;
public interface IPerson {
public void say();
}
以日誌記錄爲例
若沒有代理,每個目標對象方法裏都要寫記錄日誌的代碼,是代碼冗餘。如下
public class Man implements IPerson {
@Override
public void say() {
long begin = System.currentTimeMillis();
System.out.println("男人賺錢養家");
long end = System.currentTimeMillis();
System.out.println(end-begin);
}
}
若採用靜態代理:
靜態代理:
靜態代理髮生在編譯期間。收到創建的。在編譯時就已經將接口,被代理類,代理類等確定下來。代理類和代理對象都要實現同一個接口,同時,代理對象要操控目標對象。
缺點:接口和代理類是一對一的,有多個接口代理,就需要多個代理類,繁瑣,類爆炸。
Man.class
package proxy;
public class Man implements IPerson {
@Override
public void say() {
System.out.println("男人賺錢養家");
}
}
PersonProxy.class
package proxy;
public class PersonProxy implements IPerson{
IPerson person;
public PersonProxy(IPerson person){ //把目標對象person傳入
this.person=person; //生成本類的person對象
}
@Override
public void say() {
long begin = System.currentTimeMillis();
person.say(); //引用目標對象調用目標對象的方法
long end = System.currentTimeMillis();
System.out.println(end-begin);
}
}
ProxTest.class
package proxy;
public class ProxTest {
public static void main(String[] args) {
Man man = new Man();
Women women = new Women();
OldMan oldMan = new OldMan();
PersonProxy manProxy = new PersonProxy(man); //生成多個代理類對象,爲不同的目標對象服務
PersonProxy womanProxy = new PersonProxy(women);
PersonProxy oldManProxy = new PersonProxy(oldMan);
manProxy.say();
womanProxy.say();
oldManProxy.say();
/* 運行結果: 男人賺錢養家
0
買衣購物
0
幹農活
0*/
}
}