代理(Proxy)是一種設計模式,提供了對目標對象另外的訪問方式;即經過代理對象訪問目標對象.這樣作的好處是:能夠在目標對象實現的基礎上,加強額外的功能操做,即擴展目標對象的功能.這裏使用到編程中的一個思想:不要隨意去修改別人已經寫好的代碼或者方法,若是需改修改,能夠經過代理的方式來擴展該方法。html
舉個例子來講明代理的做用:假設咱們想邀請一位明星,那麼並非直接鏈接明星,而是聯繫明星的經紀人,來達到一樣的目的.明星就是一個目標對象,他只要負責活動中的節目,而其餘瑣碎的事情就交給他的代理人(經紀人)來解決.這就是代理思想在現實中的一個例子java
用圖表示以下:編程
代理模式的優點在於:設計模式
Java中的代理模式主要分爲三種:靜態代理、動態代理、cglib代理。ide
靜態代理在使用時,須要定義接口或者父類,被代理對象與代理對象一塊兒實現相同的接口或者是繼承相同父類.測試
下面舉個案例來解釋:
模擬保存動做,定義一個保存動做的接口:IUserDao.java,而後目標對象實現這個接口的方法UserDao.java,此時若是使用靜態代理方式,就須要在代理對象(UserDaoProxy.java)中也實現IUserDao接口.調用的時候經過調用代理對象的方法來調用目標對象.
須要注意的是,代理對象與目標對象要實現相同的接口,而後經過調用相同的方法來調用目標對象的方法this
代碼示例:
接口:IUserDao.javaspa
/** * 接口 */ public interface IUserDao { void save(); }
目標對象:UserDao.java設計
/** * 接口實現 * 目標對象 */ public class UserDao implements IUserDao { public void save() { System.out.println("----已經保存數據!----"); } }
代理對象:UserDaoProxy.java3d
/** * 代理對象,靜態代理 */ public class UserDaoProxy implements IUserDao{ //接收保存目標對象 private IUserDao target; public UserDaoProxy(IUserDao target){ this.target=target; } public void save() { System.out.println("開始事務..."); target.save();//執行目標對象的方法 System.out.println("提交事務..."); } }
測試類:App.java
/** * 測試類 */ public class App { public static void main(String[] args) { //目標對象 UserDao target = new UserDao(); //代理對象,把目標對象傳給代理對象,創建代理關係 UserDaoProxy proxy = new UserDaoProxy(target); proxy.save();//執行的是代理的方法 } }
靜態代理總結:
1.能夠作到在不修改目標對象的功能前提下,對目標功能擴展.
2.缺點:
如何解決靜態代理中的缺點呢?答案是能夠使用動態代理方式。
參考連接: