代理模式(proxy)是結構性模式的一種。結構型模式的核心作用是從程序的結構上實現低耦合,從而可以擴大整體的類結構,用來解決更大的問題。
模式的使用場景
代理模式的核心作用就是通過代理來控制對象的訪問。可以通過詳細控制訪問某個對象的方法,在調用這個方法後做後置處理(即AOP的微觀實現)
代理模式也是AOP(aspect oriented programming面向切面編程)的核心實現機制。
代理模式的角色
抽象角色:定義代理角色和真實角色的公共方法。
真實角色:實現抽象角色,定義真實角色所要實現的業務邏輯,供代理角色調用。它關注真正的業務邏輯。
代理角色:實現抽象角色,是真實角色的代理,通過真實角色的業務邏輯方法來實現抽象方法,並可以附加自己的操作。將統一的角色控制放到代理類中處理。
靜態代理
//抽象代理類,大歌星唱歌需要的工作
public interface Star {
void confer();//和客戶會面
void signconfer();//籤合同
void bookTicket();//訂票
void sing();//唱歌
void collectMoney();//收尾款
}
//被代理類,真實歌星
public class RealStar implements Star{
public void bookTicket() {
//真實對象自己操作
}
public void collectMoney() {
//真實對象自己操作
}
public void confer() {
//真實對象自己操作
}
public void signconfer() {
//真實對象自己操作
}
public void sing() {
//真實對象自己操作
}
}
//代理類,經紀人
public class Proxy implements Star{
//被代理的對象的實體調用
private Star star;
public Proxy(Star star){
super();
this.star = star ;
}
public void bookTicket() {
//代理類幫忙做無關緊要的方法和業務操作
}
public void collectMoney() {
//代理類幫忙做無關緊要的方法和業務操作
}
public void confer() {
//代理類幫忙做無關緊要的方法和業務操作
}
public void signconfer() {
//代理類幫忙做無關緊要的方法和業務操作
}
public void sing() {
//真正的業務邏輯交給被代理的對象自己做
star.sing();
}
}
//調用的操作
public class Client {
public static void main(String[] args) {
//被代理對象實例的創建
Star realStar = new RealStar();
//代理對象實例的創建
Star proxy = new Proxy(realStar);
//代理對象來執行方法
proxy.confer();
proxy.signconfer();
proxy.bookTicket();
proxy.sing();
proxy.signconfer();
}
}
動態代理
動態代理類是動態生成代理類。
優點
抽象角色中聲明的所有方法都被轉移到調用處理器一個集中的方法處理,這樣,我們可以更加靈活和統一的處理衆多方法。(而且動態生成可以讓程序直接生成相應的二進制編碼,更加節省操作時間)
使用場景
JDK自帶的動態代理。
java.lang.reflect.Proxy作用:動態生成代理器和對象
java.lang.reflect.InvocationHandler(接口處理器)可以通過invoke方法實現對真實角色的代理訪問,每次通過proxy生成代理對象時都要制定對應的處理器對象。
動態代理代碼實現
//抽象代理類,大歌星唱歌需要的工作
public interface Star {
void confer();//和客戶會面
void signconfer();//籤合同
void bookTicket();//訂票
void sing();//唱歌
void collectMoney();//收尾款
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class StarHandler implements InvocationHandler{
private Star realstar;
public StarHandler(Star star){
super();
this.realstar = star ;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
method.invoke(realstar, args);
return null;
}
}
public class Client {
public static void main(String[] args) {
//被代理對象實例的創建
Star realStar = new RealStar();
//代理對象實例的創建
StarHandler handler = new StarHandler(realStar);
Star proxy =(Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),new Class[]{Star.class},handler);
//代理對象來執行方法
proxy.confer();
proxy.signconfer();
proxy.bookTicket();
proxy.sing();
proxy.signconfer();
}
}