設計模式[8]-代理模式-Proxy Pattern

1. 代理模式

代理模式(Proxy Pattern)是常用的結構性設計模式,和裝飾者模式非常相似,代理類和被代理類實現了同樣的接口。代理模式完全隱藏了被代理的對象,并可以控制方法的訪問過程。

代理模式的角色一共有三種。

  • Subject(抽象主題角色): RealSubject和Proxy實現的共同接口。

  • RealSubject(真實主題角色):是被代理的對象,客戶端對RealSubject毫無所知。

  • Proxy(代理主題角色): 負責代理RealSubject,控制RealSubject的方法訪問過程。

本文只討論靜態(tài)的代理模式,Java的動態(tài)代理涉及到反射或cglib的技術,不是本次討論的重點,關于動態(tài)代理的內容,可以參考http://www.itdecent.cn/p/4fe5a75b9202 。

2. 代理模式舉例

下面我們舉一個租房的例子,客戶只知道中介,不知道房東是誰,最終把房子租下來了。

序號 類名 角色 說明
1 Rentable Subject 抽象主題角色,租房接口
2 Owner RealSubject 真實主題角色,房東
3 Agency Proxy 代理主題角色,中介
4 ProxyMain 客戶端 演示調用,租客
Paste_Image.png

1. Rentable類

// 抽象主題,可以出租的
public interface Rentable {
    // 出租
    void rent();
}

2. Owner類

// 真實主題角色,房東
public class Owner implements Rentable{

    @Override
    public void rent() {
        System.out.println("房東出租三居室一套");
    }
}

3. Agency

// 代理角色,中介,客戶端不知道被代理的對象。
public class Agency implements Rentable{

    private Owner owner;

    // 代理模式直接在構造函數里面new一個被代理對象。
    // 注意對比裝飾者模式,構造器是不同的。
    public Agency() {
        super();
        this.owner = new Owner();
    }

    // 代理模式注重控制對方法的訪問
    @Override
    public void rent() {
        // 可以在這里做權限驗證等功能,類似Spring AOP。
        System.out.println("中介宣傳、并帶看房子");
        owner.rent();
        System.out.println("和中介簽訂租房合同");
    }
}

4. ProxyMain

// 客戶端,即租客,只知道中介,不認識房東。
public class ProxyMain {

    public static void main(String[] args) {
        Agency agency = new Agency();
        agency.rent();
    }
}

3. 代理模式總結

優(yōu)點:
代理模式完全隱藏了被代理的對象,方便控制方法被訪問的過程。

缺點:
代理模式有可能使請求處理速度變慢。

4. 代理模式和裝飾者模式的對比

相同點:
代理模式中,代理類和被代理類都實現同一個接口;裝飾者模式中,裝飾類和被裝飾類也都實現同一個接口。

不同點:
代理類和裝飾類的構造器是不同。代理類在構造器是無參的,明確地創(chuàng)建了一個對象,即只代理一個固定的對象;裝飾類的構造器是有參的,可以動態(tài)的指定被裝飾的對象。

裝飾者模式注重為被裝飾者添加新的方法;代理模式注重對代理對象的方法訪問做控制。

(完)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容