代理對象一般定義了一個(gè)與目標(biāo)對象相似或相近的行為。代理對象負(fù)責(zé)對真實(shí)模塊調(diào)用,這使得調(diào)用者與被調(diào)用者之間建立了一個(gè)隔離帶。
場景示例說明:老總說話都是很精簡,每次發(fā)布一個(gè)消息時(shí),總是先將簡要內(nèi)容交給秘書MM,秘書MM經(jīng)過一番美化后,把消息公布出來。
設(shè)老總=Boss,秘書MM=MMProxy
于是簡單的代理就有
1 public class Boss {
2 public void anounce(String content) {
3 System.out.println(content);
4 }
5 }
1 public class MMProxy {
2 public void anounce(String content) {
3 System.out.print("boss: 大家請注意了!");
4 new Boss().anounce(content);
5 }
6 }
new MMProxy().anounce("我請大家吃飯。");
結(jié)果出來的是:
boss: 大家請注意了!我請大家吃飯。
通過上面發(fā)現(xiàn),這種代理比較呆板,比如說,Boss口渴了,又得重新寫一個(gè)代理方法,這個(gè)時(shí)候,可以使用動(dòng)態(tài)代理來進(jìn)行:
添加一個(gè)接口IBoss
1 public interface IBoss {
2 public void anounce(String content);
3 public void drink();
4 }
修改Boss
1 public class Boss implements IBoss {
2 public void anounce(String content) {
3 System.out.println(content);
4 }
5
6 public void drink() {
7 System.out.println("boss: 拿起杯子,喝水");
8 }
9 }
這時(shí)秘書MM變?yōu)?/div>
1 import java.lang.reflect.InvocationHandler;
2 import java.lang.reflect.Method;
3
4 public class MMProxy implements InvocationHandler {
5
6 private Object obj;
7
8 public MMProxy(Object obj) {
9 this.obj = obj;
10 }
11
12 public static Object newInstance(Object obj) {
13 return java.lang.reflect.Proxy.newProxyInstance(
14 obj.getClass().getClassLoader(),
15 obj.getClass().getInterfaces(),
16 new MMProxy(obj));
17 }
18
19 @Override
20 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
21 if("drink".equals(method.getName())) {
22 System.out.println("秘書MM: 看到boss想喝水了,于是 把水倒進(jìn)boss的杯子里。");
23 } else if("anounce".equals(method.getName())) {
24 System.out.print("boss: 大家請注意!");
25 }
26 method.invoke(obj, args);
27 return null;
28 }
29 }
IBoss boss = (IBoss) MMProxy.newInstance(new Boss());
boss.anounce("我請大家吃飯。");
boss.drink();
boss: 大家請注意!我請大家吃飯。
秘書MM: 看到boss想喝水了,于是 把水倒進(jìn)boss的杯子里。
boss: 拿起杯子,喝水
現(xiàn)在發(fā)現(xiàn)了吧,秘書MM真是服務(wù)周到呀。