1. 程式人生 > >代理模式_靜態代理

代理模式_靜態代理

在閻巨集博士的《JAVA與模式》一書中開頭是這樣描述代理(Proxy)模式的:

  代理模式是物件的結構模式。代理模式給某一個物件提供一個代理物件,並由代理物件控制對原物件的引用。


代理模式的結構

  所謂代理,就是一個人或者機構代表另一個人或者機構採取行動。在一些情況下,一個客戶不想或者不能夠直接引用一個物件,而代理物件可以在客戶端和目標物件之間起到中介的作用。

  代理模式類圖如下:

  

  在代理模式中的角色:

  ●  抽象物件角色:聲明瞭目標物件和代理物件的共同介面,這樣一來在任何可以使用目標物件的地方都可以使用代理物件。

  ●  目標物件角色:

定義了代理物件所代表的目標物件。

  ●  代理物件角色:代理物件內部含有目標物件的引用,從而可以在任何時候操作目標物件;代理物件提供一個與目標物件相同的介面,以便可以在任何時候替代目標物件。代理物件通常在客戶端呼叫傳遞給目標物件之前或之後,執行某個操作,而不是單純地將呼叫傳遞給目標物件。

原始碼

  抽象物件角色

public abstract class AbstractObject {
    //操作
    public abstract void operation();
}

  目標物件角色

 

public class RealObject extends AbstractObject {
    @Override
    public void operation() {
        //一些操作
        System.out.println("一些操作");
    }
}

 

  代理物件角色

 

public class ProxyObject extends AbstractObject{
    RealObject realObject = new RealObject();
    @Override
    public void operation() {
        //呼叫目標物件之前可以做相關操作
        System.out.println("before");        
        realObject.operation();        
        //呼叫目標物件之後可以做相關操作
        System.out.println("after");
    }
}

 

  客戶端

 

public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        AbstractObject obj = new ProxyObject();
        obj.operation();
    }

}

 

  從上面的例子可以看出代理物件將客戶端的呼叫委派給目標物件,在呼叫目標物件的方法之前跟之後都可以執行特定的操作。

       代理模式和介面卡模式的區別:

       代理模式中被代理的物件和代理物件實現了相同的介面,而介面卡模式中的物件適配只是將目標物件委派到了介面卡物件中,目標物件和介面卡物件並沒有實現相同的介面。