Java設計模式:代理模式(轉)

 代理(Proxy)是一種設計模式,提供了對目標對象另外的訪問方式;即經過代理對象訪問目標對象.這樣作的好處是:能夠在目標對象實現的基礎上,加強額外的功能操做,即擴展目標對象的功能.這裏使用到編程中的一個思想:不要隨意去修改別人已經寫好的代碼或者方法,若是需改修改,能夠經過代理的方式來擴展該方法。html

舉個例子來講明代理的做用:假設咱們想邀請一位明星,那麼並非直接鏈接明星,而是聯繫明星的經紀人,來達到一樣的目的.明星就是一個目標對象,他只要負責活動中的節目,而其餘瑣碎的事情就交給他的代理人(經紀人)來解決.這就是代理思想在現實中的一個例子java

用圖表示以下:編程

代理模式的優點在於:設計模式

  • 1.可以協調調用者和被調用者,在必定程度上下降了系統的耦合度;
  • 2.加強和擴充被調用者的功能,簡化被調用者的使用流程;

Java中的代理模式主要分爲三種:靜態代理、動態代理、cglib代理。ide

一.靜態代理

靜態代理在使用時,須要定義接口或者父類,被代理對象與代理對象一塊兒實現相同的接口或者是繼承相同父類.測試

下面舉個案例來解釋:
模擬保存動做,定義一個保存動做的接口:IUserDao.java,而後目標對象實現這個接口的方法UserDao.java,此時若是使用靜態代理方式,就須要在代理對象(UserDaoProxy.java)中也實現IUserDao接口.調用的時候經過調用代理對象的方法來調用目標對象.
須要注意的是,代理對象與目標對象要實現相同的接口,而後經過調用相同的方法來調用目標對象的方法this

代碼示例:
接口:IUserDao.javaspa

/**
 * 接口
 */
public interface IUserDao {

    void save();
}
IUserDao.java

目標對象:UserDao.java設計

/**
 * 接口實現
 * 目標對象
 */
public class UserDao implements IUserDao {
    public void save() {
        System.out.println("----已經保存數據!----");
    }
}
UserDao.java

代理對象: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("提交事務...");
    }
}
UserDaoProxy.java

測試類:App.java

/**
 * 測試類
 */
public class App {
    public static void main(String[] args) {
        //目標對象
        UserDao target = new UserDao();

        //代理對象,把目標對象傳給代理對象,創建代理關係
        UserDaoProxy proxy = new UserDaoProxy(target);

        proxy.save();//執行的是代理的方法
    }
}
App.java

靜態代理總結:
1.能夠作到在不修改目標對象的功能前提下,對目標功能擴展.
2.缺點:

  • 由於代理對象須要與目標對象實現同樣的接口,因此會有不少代理類,類太多.同時,一旦接口增長方法,目標對象與代理對象都要維護。
  • 代理對象的一個接口只服務於一種類型的對象,若是要代理的方法不少,勢必要爲每一種方法都進行代理,靜態代理在程序規模稍大時就沒法勝任了。

如何解決靜態代理中的缺點呢?答案是能夠使用動態代理方式。

參考連接:

1.Java的三種代理模式

相關文章
相關標籤/搜索