什么是代理
在進行操作時有時不希望用戶直接接觸到目標,這時需要使用代理讓用戶間接接觸到目標
給目標對象提供一個代理對象,并且由代理對象控制著對目標對象的引用
圖解:
代理的目的
控制訪問:通過代理對象的方式間接的訪問目標對象,防止直接訪問目標對象給系統帶來不必要的復雜性
功能增強:通過代理業務對原有業務進行增強
靜態代理
如下代碼是代理實例,并且實現控制訪問
實現功能增強
?靜態代理的缺點:當目標類增多的時候,代理類直接增加代理的目標類,會造成代理邏輯混亂
動態代理
package Test20250219DaiLi; public class Test { public static void main(String[] args) { // Proxy proxy = new Proxy(); // proxy.clothes("xxxL"); ClothesFactory clothesFactory = new ClothesFactory(); ByClothes clothes = (ByClothes) new DyProxy(clothesFactory).getProxyInterFace(); clothes.clothes("XXXL"); ShootFactory shootFactory = new ShootFactory(); ByShoot shoot= (ByShoot) new DyProxy(shootFactory).getProxyInterFace(); shoot.Shoot("42"); } }
package Test20250219DaiLi; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DyProxy implements InvocationHandler { //被代理的對象 //代理對象如何得知自己代理的是哪個目標類 //這里這樣寫其實是讓用戶告訴我,我要代理誰 private Object o ; public DyProxy(Object o){ this.o = o; } //2.獲取目標類的接口,要知道自己代理的核心方法是啥? public Object getProxyInterFace(){ return Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(),this); } //知道了接口----》變相得知了自己要代理的核心方法: //invoke方法是利用反射的方式獲取到了要代理的核心方法 //1.Object:jdk創建的代理類,無需賦值 //2.Method:目標類當中的方法,jdk提供,無需賦值 //3.Object[]:目標類當中的方法的參數,jdk提供,無需賦值 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { FrontService(); method.invoke(o,args); endService(); return null; } //前置服務 public void FrontService() { System.out.println("根據您的需求進行市場調研"); } //前置服務 public void endService() { System.out.println("為您提供一條龍的包辦服務"); } }
package Test20250219DaiLi; public interface ByClothes { public abstract void clothes(String size); }
package Test20250219DaiLi; /** * 賣衣服的工廠 * 目標類 */ public class ClothesFactory implements ByClothes{ public void clothes(String size){ System.out.println("已經給您定制好了一件大小為"+size+"的衣服"); } public void 機器處理(){ } public void 原材料(){} }