核心作用
通過代理妖胀,控制對(duì)象的訪問杠输。
可以詳細(xì)控制訪問某個(gè)(某類)對(duì)象的方法翅阵,在調(diào)用這個(gè)方法前做前置處理歪玲,調(diào)用這個(gè)方法后做后置處理
核心角色
- 抽象角色
定義代理角色和真實(shí)角色的公共對(duì)外方法迁央。 - 真是角色
實(shí)現(xiàn)抽象角色,定義真實(shí)角色所要實(shí)現(xiàn)的業(yè)務(wù)邏輯滥崩,供代理角色調(diào)用岖圈。
關(guān)注真正的業(yè)務(wù)邏輯。 - 代理角色
實(shí)現(xiàn)抽象角色钙皮,是真實(shí)角色的代理蜂科,通過真實(shí)角色的業(yè)務(wù)邏輯方法來實(shí)現(xiàn)抽象方法,并可以附加自己的操作短条。
將統(tǒng)一的流程控制放到代理角色导匣。
分類
- 靜態(tài)代理
- 動(dòng)態(tài)代理
靜態(tài)代理
-
UML
- 代碼實(shí)現(xiàn)
package com.amberweather.proxy.staticProxy;
public interface Star {
//面談
void confer();
//簽合同
void signContract();
//訂票
void bookTicket();
//唱歌
void sing();
//管錢
void collectMoney();
}
package com.amberweather.proxy.staticProxy;
public class RealStar implements Star {
@Override
public void confer() {
System.out.println("RealStar.confer()");
}
@Override
public void signContract() {
System.out.println("RealStar.signContract()");
}
@Override
public void bookTicket() {
System.out.println("RealStar.bookTicket()");
}
@Override
public void sing() {
System.out.println("RealStar.sing()");
}
@Override
public void collectMoney() {
System.out.println("RealStar.collectMoney()");
}
}
package com.amberweather.proxy.staticProxy;
public class ProxyStar implements Star {
private Star star;
public ProxyStar(Star star) {
super();
this.star = star;
}
@Override
public void confer() {
System.out.println("ProxyStar.confer()");
}
@Override
public void signContract() {
System.out.println("ProxyStar.signContract()");
}
@Override
public void bookTicket() {
System.out.println("ProxyStar.bookTicket()");
}
@Override
public void sing() {
star.sing();
}
@Override
public void collectMoney() {
System.out.println("ProxyStar.collectMoney()");
}
}
package com.amberweather.proxy.staticProxy;
public class Client {
public static void main(String[] args) {
Star real = new RealStar();
Star proxy = new ProxyStar(real);
proxy.confer();
proxy.signContract();
proxy.bookTicket();
proxy.sing();
proxy.collectMoney();
}
}
動(dòng)態(tài)代理
代理類在程序運(yùn)行時(shí)創(chuàng)建的代理方式被成為 動(dòng)態(tài)代理。 也就是說茸时,這種情況下贡定,代理類并不是在Java代碼中定義的,而是在運(yùn)行時(shí)根據(jù)我們?cè)贘ava代碼中的“指示”動(dòng)態(tài)生成的屹蚊。相比于靜態(tài)代理厕氨, 動(dòng)態(tài)代理的優(yōu)勢(shì)在于可以很方便的對(duì)代理類的函數(shù)進(jìn)行統(tǒng)一的處理进每,而不用修改每個(gè)代理類的函數(shù)汹粤。