Proxy Pattern
代理是一種常用的設(shè)計(jì)模式茧妒,其目的就是為其他對(duì)象提供一個(gè)代理以控制對(duì)某個(gè)對(duì)象的訪問嘶伟。代理類負(fù)責(zé)為委托類預(yù)處理消息,過濾消息并轉(zhuǎn)發(fā)消息又碌,以及進(jìn)行消息被委托類執(zhí)行后的后續(xù)處理。
當(dāng)兩個(gè)類之間需要通信時(shí),引入第三方類 將兩個(gè)類的關(guān)系解耦看圾笨,對(duì)于客戶方只需要了解代理類即可擂达,不過代理類和委托類需要實(shí)現(xiàn)同一接口,因?yàn)閷?shí)際調(diào)用的還是委托類的方法抄腔。
什么是動(dòng)態(tài)代理模式
靜態(tài)代理
- Subject 實(shí)例接口
package ProxyPattern.staticProxy;
public interface Subject {
void doSomething();
}
- RealSubject 實(shí)現(xiàn)接口邏輯
package ProxyPattern.staticProxy;
public class RealSubject implements Subject {
@Override
public void doSomething() {
System.out.println("do something! ");
}
}
如果想在doSomething()前后加上一些日志監(jiān)控等等一些業(yè)務(wù)邏輯,而需要被代理的類無需改動(dòng)奏寨。
- SubjectProxy 代理對(duì)象
package ProxyPattern.staticProxy;
public class SubjectProxy implements Subject {
private Subject subjectImpl = null;
public SubjectProxy(Subject subject) {
this.subjectImpl = subject;
}
@Override
public void doSomething() {
System.out.println("before real subject");
subjectImpl.doSomething();
System.out.println("after real subject");
}
}
- TestRunner
package ProxyPattern.staticProxy;
public class TestRunner {
public static void main(String[] args) {
Subject subjectProxy = new SubjectProxy(new RealSubject());
subjectProxy.doSomething();
}
}
結(jié)果
before real subject
do something!
after real subject
動(dòng)態(tài)代理
為什么要?jiǎng)討B(tài)代理
靜態(tài)代理的缺點(diǎn)
- 代理類和委托類實(shí)現(xiàn)了相同的接口,代理類通過委托類實(shí)現(xiàn)了相同的方法病瞳。這樣就出現(xiàn)了大量的代碼重復(fù)揽咕。如果接口增加一個(gè)方法悲酷,除了所有實(shí)現(xiàn)類需要實(shí)現(xiàn)這個(gè)方法外,所有代理類也需要實(shí)現(xiàn)此方法亲善。增加了代碼維護(hù)的復(fù)雜度设易。
- 靜態(tài)代理只能實(shí)現(xiàn)特定的某個(gè)service,假設(shè)想要代理多個(gè)實(shí)現(xiàn)類蛹头,就需要寫多個(gè)代理顿肺。
動(dòng)態(tài)代理的好處
通過一個(gè)代理類完成全部的代理功能
動(dòng)態(tài)代理的應(yīng)用
- Spring的AOP
- 遠(yuǎn)程代理
相關(guān)參考
Java 動(dòng)態(tài)代理作用是什么?
JAVA學(xué)習(xí)篇--靜態(tài)代理VS動(dòng)態(tài)代理