1. 程式人生 > >十七、代理設計模式

十七、代理設計模式

1. 代理設計模式介紹

代理設計模式,從名字中我們就能知道其大致意思。我們生活中有很多“代理”,比如,租房中介,海外代購等。就是一種本來需要A做的事,讓B去代做。

定義:

為其他物件提供一種代理以控制對這個物件的訪問。

2. 代理設計模式使用場景

  • 當我們無法直接訪問某一個物件時,可以通過一個代理物件間接訪問。通常委託物件和代理物件有著相同的介面。

  • (1)、遠端代理,為一個物件在不同的地址空間提供區域性代表,這樣可以隱藏一個物件存在於不同地址空間的事實。

  • (2)、虛擬代理,是根據需要建立開銷很大的物件,通過它來存放例項化需要很長時間的真實物件。
  • (3)、安全代理,用來控制真實物件訪問時的許可權。
  • (4)、智慧引用,當呼叫真實物件時,代理處理另外一些事。

3. 代理設計模式UML類圖

代理設計模式UML類圖

角色介紹:

  • Subject: 抽象主題類,該類的主要職責是宣告真實主題與代理的共同介面方法,該類既可以是一個抽象類,也可以是一個介面。

  • RealSubject:真實主題,該類定義類代理所表示的真實物件,由其執行具體的業務邏輯方法。

  • ProxySubject: 代理類,該類持有一個對真實主題的引用,在其所實現的介面方法中呼叫真實主題對應介面中的方法。

  • Client:測試類

4. 代理設計模式簡單實現

  • (1)、抽象主題類:
public interface Subject {
    void
visit(); }

抽象主題類中,只有一個visit()方法,代理物件和被代理代理物件均要實現這個方法。

  • (2)、真實主題:
public class RealSubject implements Subject {
    @Override
    public void visit() {
        System.out.println("Real Subject");
    }
}

真實物件中,繼承自抽象主題類,在visit()方法中,實現具體邏輯。

  • (3)、代理主題:
public class ProxySubject implements Subject
{
private RealSubject mSubject; public ProxySubject(RealSubject mSubject) { this.mSubject = mSubject; } @Override public void visit() { //通過真實主題引用的物件呼叫真實主題中的邏輯方法 mSubject.visit(); } }

ProxySubject代理類中有一個真實主題類的引用,同時代理主題類繼承了和真實主題類一模一樣的抽象類,實現了同樣的方法。只不過在代理類中,visit()方法呼叫了真實主題類的visit()方法。

  • (4)、測試類:
public class Client {

    public static void main(String[] args) {
        //構建一個真實的主題物件
        RealSubject realSubject = new RealSubject();

        //通過一個真實的主題物件構造一個代理物件
        ProxySubject proxySubject = new ProxySubject(realSubject);

        //呼叫代理的相關方法
        proxySubject.visit();
    }
}

以上模式叫做靜態代理,還有一種叫做動態代理模式。

靜態代理模式就如上述所示,我們的程式碼在執行前類的class編譯檔案就已經存在;而動態代理類則與靜態代理類相反,通過反射機制動態地生成代理者物件,代理物件將會在執行階段執行。

方法如下:我們宣告一個動態代理類:

public class DynamicProxy implements InvocationHandler {
    private Object object;//被代理物件的引用

    public DynamicProxy(Object object) {
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(object, args);
        return result;
    }
}

在上述程式碼中,我們實現了動態代理介面InvocationHandler,這是java為我們提供的,我們只需要重寫其呼叫方法invoke即可。

在以上程式碼中,我們聲明瞭一個Object的引用,該引用將指向被代理類,而我們在invoke方法中呼叫具體的被代理方法,也就是真實方法。

接著我們修改Client類方法如下:

public class Client {

    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        //構造一個動態代理物件
        DynamicProxy dynamicProxy = new DynamicProxy(realSubject);
        //類載入器
        ClassLoader classLoader = dynamicProxy.getClass().getClassLoader();
        Subject subject = (Subject) Proxy.newProxyInstance(classLoader, new Class[]{Subject.class}, dynamicProxy);

        //呼叫代理物件的visit方法。
        subject.visit();
    }
}

5. 總結

  • 代理設計模式應用比較廣泛,缺點較少。

相關推薦

代理設計模式

1. 代理設計模式介紹 代理設計模式,從名字中我們就能知道其大致意思。我們生活中有很多“代理”,比如,租房中介,海外代購等。就是一種本來需要A做的事,讓B去代做。 定義: 為其他物件提供一種代理以控制對這個物件的訪問。 2. 代理設計模式使用

介面卡設計模式

1. 介面卡模式介紹 我們在日常生活中,會經常接觸到設配器模式,比如我們的充電器,不同的手機介面型別可能不一樣,這個時候只要一個轉介面,就可以解決我們的問題。這個轉介面就是我們的介面卡。 定義 介面卡模式把一個類的介面變換成客戶端所期待的另一種介面,從

備忘錄設計模式

1. 備忘錄設計模式介紹 在不破壞封閉的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態,這樣,以後就可將該物件恢復到原先儲存的狀態。 2. 備忘錄設計模式使用場景 需要儲存一個物件在某一個時刻的狀態或部分狀態。 如果用一個介面來讓其它物件

外觀設計模式

1. 外觀設計模式介紹 顯示生活中有一個種電視萬能遙控器,只要和電視配對好了以後,就可以正常使用,不同型號的電視,只要一旦適配,所有的操作模式一模一樣。 這就是一種外觀適配模式。表面上都是同一個遙控器,實際上不同型號的電視,不同的操作,發出的型號可能各不相同

代理模式

ring style ret 代理類 out 一個 dem public cnblogs 代理模式其實很簡單,就是把具體實現從一個功能類裏面分離,又通過引用的方式把具體實現和功能類關聯,代碼如下: package test; /** * 代理模式 * @author

設計模式)——模板方法模式

ring next pri cut 限制 pack [] eat 模式 1.描述 定義一個操作中算法的骨架,而將一些步驟延伸到子類當中。模板方法使子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。 2.模式的使用 ·抽象模板(Abstract Template):

vim介紹vim顏色顯示和移動光標vim一般模式下移動光標vim一般模式下復制剪切和粘

vim介紹 vim一般模式 十七、vim介紹、vim顏色顯示和移動光標、vim一般模式下移動光標、vim一般模式下復制、剪切和粘貼一、vim介紹vim:vi的升級版,區別就是:vi在編輯文本時不會顯示顏色,而vim會。它的配置文件:/etc/vimrc、一些高級的功能可在這個配置文件/root/.vi

設計模式)橋接模式

橋接模式(Bridge),將抽象部分與他的實現部分分離,使他們都可以獨立地變化 類圖的來源 public abstract class Implementor { public ab

淺談Java設計模式)責任鏈模式(Chain of Responsibility)

前言: 接下來我們將要談談責任鏈模式,有多個物件,每個物件持有對下一個物件的引用,這樣就會形成一條鏈,請求在這條鏈上傳遞,直到某一物件決定處理該請求。但是發出者並不清楚到底最終那個物件會處理該請求,所

裝飾設計模式

1. 裝飾設計模式介紹 定義 動態地給一個物件新增一些額外的職責。就增加功能來說,裝飾模式相比生成子類更為靈活。 2. 裝飾設計模式使用場景 動態地給一個物件新增一些額外的職責。 3. 裝飾設計模式UML類圖 角色介紹: Comp

軟體設計模式學習()職責鏈模式

> 系統中如果存在多個物件可以處理一個同一請求,可以通過職責鏈模式將這些處理請求的物件連成一條鏈,讓請求沿著該鏈進行傳遞。如果鏈上的物件可以處理該請求則進行處理,否則將請求轉發給下家處理 ## 模式動機 很多情況下,可以處理某個請求的物件不止一個,如大學裡的獎學金審批,學生先向輔導員提交審批表,輔

java設計模式代理設計模式(Proxy)

pub 客戶端 clas bject 模式 只需要 java 接口 new 一個簡單Proxy代理模式範例 interface Subject{ //定義核心主題所要完成的功能 public void make(); } class RealSubj

十三模板設計模式

time nbsp args 功能 程序 模板設計模式 結束時間 pan () /* 模板設計模式:實現一個功能時,功能的一部分是確定的,一部分是不確定的,確定的部分還會用到 不確定的部分,那麽就把不確定的部分暴露出去,讓子類去實現 實現計算

Linux 入門記錄:Linux 文本/文件處理命令

指定 臨時 log linux rdquo 重復行 意義 追加內容 重定向 一、文件瀏覽 cat 查看文件內容 more 以翻頁形式查看文件內容(只能向下翻頁) less 以翻頁形式查看文件內容(可以上下翻頁) head 查看文

八周微職位:tomcat,MogileFS

十八周 第十七 微職位 1、描述Tomcat的架構;Tomcat組件,分為4類:頂層類組件:包括<Server>元素和<Service>元素,它們位於整個配置文件的頂層;連接器類組件:為<Connector>元素,代表介於客戶端與服務器端之間的通信接口,負責將客

XPath

tor 元素 mat snapshot 文檔 bool 兩個 結果 做出 二十七、XPath XPath是一種節點查找手段,對比之前使用標準DOM去查找XML中的節點方式,大大降低了查找難度,方便開發者使用。但是,DOM3級以前的標準並沒有就XPath做出規範;直到DO

JavaScript 基礎,登錄前端驗證

寫到 span 文件中 lin clas .get 至少 css 使用 1.<script></script>的三種用法: 放在<body>中 放在<head>中 放在外部JS文件中 <!DOCTYPE html&g

java之Spring(AOP)前奏-動態代理設計模式(上)

對象 .cn 分享圖片 賦值 alt his 編程習慣 輸出 style 我們常常會遇到這樣的事,項目經理讓你為一個功能類再加一個功能A,然後你加班為這個類加上了功能A; 過了兩天又來了新需求,再在A功能後面加上一個新功能B,你加班寫好了這個功能B,加在了A後面;又過

代理設計模式

模式 操作 bsp 調用 println 對象 real int 代理上網 假設有這樣一種情景: l 張三借給李四5000000塊錢 l 李四不換了,張三很生氣 l 張三找到王五,王五是討債公司的 l 王五準備了老虎閘和辣椒水 l 把李四欠張三的錢拿回來了 也就是說,張