一些個人理解
顧名思義,就是代理一個對象。
那么,既然要代理一個東西,就要傳入它吧?
【1】所以將代理對象當作屬性【【2】往往通過構造方法傳入被代理的目標對象】。
既然要代理,那必然要和代理對象擁有相同的功能吧?
所以實現了和代理對象相同的方法。【3】
那么我們怎么能實現同樣的功能呢?
我們讓他們實現同一個接口就行。【4】
但是如果我實現了功能,還要自己執行的話,豈不是這個代理反而和被代理的目標對象混為一談,變成一個東西了嗎?,
考慮到我們傳入的被代理的目標對象,顯然是通過這個傳入的目標對象來執行功能【5】
一個例子
假如有個計算器接口,功能是簡單的加減乘除。
【4,創建一個接口】
public interface MathCalculator {int div(int i, int j);int mul(int i, int j);int sub(int i, int j);int add(int i, int j);}
【接口的實現類,被代理的對象】
public class MathCalculatorImpl implements MathCalculator {@Overridepublic int div(int i, int j) {return 0;}@Overridepublic int mul(int i, int j) {return 0;}@Overridepublic int sub(int i, int j) {return 0;}@Overridepublic int add(int i, int j) {return i+j;}
}
【代理對象,和被代理對象一樣,實現同一個接口】
public class CalculatorStaticProxy implements MathCalculator {private MathCalculator mathCalculator;//【1,將目標對象當作屬性】// 【2】通過構造方法傳入被代理的目標對象public CalculatorStaticProxy(MathCalculator mathCalculator) {this.mathCalculator = mathCalculator;}// 【3】要和代理對象擁有相同的功能@Overridepublic int div(int i, int j) {// 【5】,使用傳入的目標對象來執行功能return this.mathCalculator.div(i,j);}@Overridepublic int mul(int i, int j) {// 【5】,使用傳入的目標對象來執行功能return this.mathCalculator.mul(i,j);}@Overridepublic int sub(int i, int j) {// 【5】,使用傳入的目標對象來執行功能return this.mathCalculator.sub(i,j);}@Overridepublic int add(int i, int j) {// 【5】,使用傳入的目標對象來執行功能return this.mathCalculator.add(i,j);}
}
【測試靜態代理】
public class MathCalTest {@Testpublic void test01() {MathCalculator mathCalculator = new MathCalculatorImpl();CalculatorStaticProxy calculatorStaticProxy = new CalculatorStaticProxy(mathCalculator);int add = calculatorStaticProxy.add(1, 1);System.out.println(add);}
}
附加說明
代理模式(Proxy)?,為其他對象提供一種代理以控制對這個對象的訪問。
ISubject類,定義了RealSubject和Proxy的共用接口,這樣就在任何使用RealSubject的地方都可以使用Proxy
RealSubject類,定義Proxy所代表的真實實體
Proxy類,保存一個引用使得代理可以訪問實體,并提供與Subject的接口相同的方法,這樣代理就可以用來替代實體