代理模式是常用的java設計模式,他的特徵是代理類與委託類有同樣的接口,代理類主要負責爲委託類預處理消息、過濾消息、把消息轉發給委託類,以及事後處理消息等。代理類與委託類之間通常會存在關聯關係,一個代理類的對象與一個委託類的對象關聯,代理類的對象本身並不真正實現服務,而是通過調用委託類的對象的相關方法,來提供特定的服務。簡單的說就是,我們在訪問實際對象時,是通過代理對象來訪問的,代理模式就是在訪問實際對象時引入一定程度的間接性,因爲這種間接性,可以附加多種用途。
靜態代理
由程序員創建或特定工具自動生成源代碼,也就是在編譯時就已經將接口,被代理類,代理類等確定下來。在程序運行之前,代理類的.class文件就已經生成。
public interface Marry { void prepare();//籌備婚禮 void weeding();//婚禮 void clear();//婚禮後收拾場地 }
public class Bridegroom implements Marry{ @Override public void prepare() { // TODO Auto-generated method stub } @Override public void weeding() { System.out.println("新郎正在進行婚禮"); } @Override public void clear() { // TODO Auto-generated method stub } }
public class MarryProxy implements Marry{ private Marry bridegroom; public MarryProxy(Marry bridegroom) { this.bridegroom = bridegroom; } @Override public void prepare() { System.out.println("婚前場地準備"); } @Override public void weeding() { this.bridegroom.weeding(); } @Override public void clear() { System.out.println("婚後收拾場地"); } }
public class Test { public static void main(String[] args) { Marry proxy = new MarryProxy(new Bridegroom()); proxy.prepare(); proxy.weeding(); proxy.clear(); } }
結果:
婚前場地準備
新郎正在進行婚禮
婚後收拾場地
動態代理
代理類在程序運行時自動創建的代理方式被成爲動態代理。
在java的java.lang.reflect包下提供了一個Proxy類和一個InvocationHandler接口,通過這個類和這個接口可以生成JDK動態代理類和動態代理對象。
Proxy 動態生成代理類和對象
InvocationHandler 處理器接口,可以通過invoke方法實現對真實角色的代理訪問,每次通過Proxy生成代理類對象時都要指定對應的處理器對象。
public interface Marry { void prepare();//籌備婚禮 void weeding();//婚禮 void clear();//婚禮後收拾場地 }
public class Bridegroom implements Marry{ @Override public void prepare() { // TODO Auto-generated method stub } @Override public void weeding() { System.out.println("新郎正在進行婚禮"); } @Override public void clear() { // TODO Auto-generated method stub } }
public class MarryHandler implements InvocationHandler{ private Marry bridegroom; public MarryHandler(Marry bridegroom) { super(); this.bridegroom = bridegroom; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { method.invoke(bridegroom, args); return null; } }
public class Test { public static void main(String[] args) { Marry bridegroom = new Bridegroom(); MarryHandler handler = new MarryHandler(bridegroom); Marry proxy = (Marry) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] { Marry.class }, handler); proxy.weeding(); } }