Java中的代理和委托是軟件開發(fā)中的兩個關(guān)鍵概念。它們都是實現(xiàn)對象的代碼重用,但是它們的實現(xiàn)方式和應(yīng)用場景卻有很大的不同。
Java代理是指在一個對象之前定義另一個對象。它通常用于實現(xiàn)實際對象的訪問控制。比如說,一個“RealSubject”對象可以被代理,在客戶端中只有“Subject”對象是可見的,而客戶端并不知道實際的“RealSubject”對象。
interface Subject { void request(); } class RealSubject implements Subject { public void request() { System.out.println("RealSubject.request()"); } } class Proxy implements Subject { private RealSubject realSubject; public Proxy(RealSubject realSubject) { this.realSubject = realSubject; } public void request() { System.out.println("Proxy.request()"); realSubject.request(); } } public class Test { public static void main(String[] args) { RealSubject realSubject = new RealSubject(); Proxy proxy = new Proxy(realSubject); proxy.request(); } }
Java委托是一個類或者對象旨在把任務(wù)分派給另一個類或者對象。它通常不是從一個接口繼承,而是通過組合。它可以充分利用代碼的重用和設(shè)計模式,因為它可以實現(xiàn)一種簡單的方式來改變系統(tǒng)中的行為。
interface Calculator { int add(int a, int b); } class SimpleCalculator implements Calculator { public int add(int a, int b) { return a + b; } } class MathCalculator implements Calculator { private final Calculator calculator; public MathCalculator(Calculator calculator) { this.calculator = calculator; } public int add(int a, int b) { int result = calculator.add(a, b); System.out.println("MathCalculator.add(" + a + ", " + b + ") = " + result); return result; } } public class Test { public static void main(String[] args) { Calculator calculator = new SimpleCalculator(); calculator = new MathCalculator(calculator); int result = calculator.add(1, 2); System.out.println("result = " + result); } }
代理和委托都嘗試為應(yīng)用程序的應(yīng)用程序改進和性能優(yōu)化提供一些幫助。代理與委托之所以有所不同,是因為代理對象包含被代理對象的引用,而委托則是通過組合來實現(xiàn)的。如果需要保密性和訪問控制,代理就是首選。如果需要代碼重用和動態(tài)行為定義,那么委托就是首選。