代理模式:Proxy Pattern
又名:“委托模式”笙瑟。
原話:Provide a surrogate or placeholder for another object to control access to it.
直譯:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問甚脉。
1. 定義:為對(duì)象提供一種代理方式控制該對(duì)象的訪問贵试。
2. 示例類圖:
代理模式通用類圖
3. 示例代碼:
//抽象主題接口:
interface Subject{
//定義一個(gè)方法:
public void request();
}
//真實(shí)主題類:
class RealSubject implements Subject {
//實(shí)現(xiàn)方法:
public void request(){
//業(yè)務(wù)邏輯處理
}
}
//代理類:
class Proxy implements Subject {
//要代理哪個(gè)實(shí)現(xiàn)類:
private Subject subject = null;
//默認(rèn)被代理者:
public Proxy(){
this.subject = new Proxy();
}
//通過構(gòu)造函數(shù)傳遞代理者:
public Proxy(Subject _subject){
this.subject = _subject;
}
//實(shí)現(xiàn)接口中定義的方法:
public void request(){
this.before();
this.subject.request();
this.after();
}
//預(yù)處理:
private void before(){
//do something
}
//善后處理:
private void after(){
//do something
}
}
要代理誰就產(chǎn)生該代理的實(shí)例,然后傳入被代理者。
4. 優(yōu)點(diǎn):
- 職責(zé)清晰明確:
真實(shí)角色實(shí)現(xiàn)實(shí)際的業(yè)務(wù)邏輯壹无,后期用代理再完成一件事物。
5. 高擴(kuò)展性:
角色不確定感帅,可能隨時(shí)發(fā)生變化斗锭,代理類可以在不修改下使用。
6. 智能化:
動(dòng)態(tài)代理失球。
7. 使用場景:非常多a恰!
例如:打官司為何要請律師实苞?因?yàn)椴幌虢槿胫虚g過程的是是非非豺撑,大部分交給別人去做,能減輕自己的負(fù)擔(dān)黔牵。
8. 擴(kuò)展代理:
- 普通代理:客戶端只能訪問代理角色聪轿,不能訪問真實(shí)角色。
- 強(qiáng)制代理:客戶端直接調(diào)用真實(shí)角色猾浦,不關(guān)心代理是否存在陆错,通過真實(shí)角色找到代理角色灯抛。(在真實(shí)類中添加getProxy方法)
- 動(dòng)態(tài)代理:在實(shí)現(xiàn)階段不用關(guān)心代理誰,而在運(yùn)行階段才指定代理哪一個(gè)對(duì)象音瓷。
面向橫切面編程:AOP(Aspect Oriented Programming)核心使用動(dòng)態(tài)代理機(jī)制对嚼。
//動(dòng)態(tài)代理示例:
public class GamePlayIH implements InvocationHandler{
//被代理者
Class cls = null;
//被代理的實(shí)例
Object obj = null;
//我要代理誰
public GamePlayIH(Object _obj){
this.obj = _obj;
}
//調(diào)用被代理的方法
public Object invoke(Object Proxy,Method method,Object[] args)
throws Throwable{
Object result = method.invoke(this.obj,args);
return result;
}
}