1. 程式人生 > >java設計模式學習筆記--代理模式

java設計模式學習筆記--代理模式

1. 什麼是代理模式

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

2.代理模式的結構

代理模式有兩種:靜態代理和動態代理。
先來看一下靜態代理:

2.1 靜態代理:

在代理模式中,有三個角色:

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

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

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

例子如下:

/**
 * 抽象物件角色
 */
public abstract class AbstractObject {
    public abstract void operation();
}
/**
 * 目標物件角色
 */
public class RealObject extends AbstractObject{
    @Override
    public void operation() {
        System.out.println("do something");
    }
}
/**
 * 代理物件角色
 */
public class ProxyObject
extends AbstractObject{
private AbstractObject ao; public ProxyObject(AbstractObject ao) { this.ao = ao; } @Override public void operation() { System.out.println("before.........."); ao.operation(); System.out.println("after..........."); } }
public class Client {
    public static void main(String[] args){
        AbstractObject ao = new RealObject();
        ProxyObject po = new ProxyObject(ao);
        po.operation();
    }
}

執行結果如下:
before..........
do something
after...........

靜態代理很簡單,看一下就可以看懂。
靜態代理的特點:在程式執行之前。代理類就已經生成了。
缺點:
1、代理物件的一個介面只服務於一種型別的物件,如果要代理的方法很多,勢必要為每一種方法都進行代理,靜態代理在程式規模稍大時就無法勝任了。
2、如果介面增加一個方法,除了所有實現類需要實現這個方法外,所有代理類也需要實現此方法。增加了程式碼維護的複雜度。

所以,當出現需要代理很多類時,我們就可以使用動態代理。

2.2 動態代理

先來看程式碼:

首先還是定義一個動態代理介面:

public interface TestInterface {
    void Sing();
}

寫一個實現類:

public class TestClass implements TestInterface{

    @Override
    public void Sing() {
        System.out.println("sing a song");
    }
}

建立動態代理類,這裡必須實現InvocationHandler介面,並實現介面中的invoke()方法。

public class DynamicProxy implements InvocationHandler{

    private Object object;

    public Object newInstance(Object object){
        this.object = object;
        //生成一個動態代理類
        return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before sing......... ");
        Object ob = method.invoke(object,args);
        System.out.println("after sing.......... ");
        return ob;
    }
}
public class Client {
    public static void main(String[] args){
        TestInterface ti = new TestClass();
        DynamicProxy dp = new DynamicProxy();
        TestInterface t = (TestInterface) dp.newInstance(ti);
        t.Sing();
    }
}


輸出:
before sing......... 
sing a song
after sing.......... 

1、之所以成為動態代理,是因為只在執行時才將類創建出來,程式碼開始執行時,還沒有Proxy類,他是根據傳入的介面集建立的。
2、InvocationHandler是一個幫助proxy的介面,proxy會把呼叫轉發給他處理。proxy本身是利用Proxy.newProxyInstance()方法(該方法傳入的只能是介面陣列,裡面不能有類),在執行時動態建立的。

動態代理優點:
動態代理模式通過使用反射,可以在執行期決定載入哪個類,避免了一個類對應一個代理的問題。

相關推薦

java設計模式學習筆記--代理模式

1. 什麼是代理模式 代理模式是物件的結構模式。代理模式給某一個物件提供一個代理物件,並由代理物件控制對原物件的引用。 2.代理模式的結構 代理模式有兩種:靜態代理和動態代理。 先來看一下靜態代理: 2.1 靜態代理: 在代理模式中,有三個角色:

設計模式學習筆記-代理模式

定義:代理模式,為其他物件提供一種代理以控制對這個物件的訪問,及通過代理物件訪問目標物件,這樣可以在不修改原目標物件的前提下,提供額外的功能操作 應用場景:1、比如在某物件執行方法後,記錄日誌; 代理模式可以分為靜態代理和動態代理。靜態代理就是在程式碼編譯時,硬編碼到程式中的代理類;動態代理就是在程式執行

java設計模式學習筆記--原型模式(淺克隆和深克隆)

1. 什麼是原型模式 原型模式屬於物件的建立模式。。原型模式允許你通過複製現有的例項來建立新的例項。 這個模式的重點在於,客戶端的程式碼在不知道要例項化何種特定類的情況下,可以製造出新的例項。在java中,一般使用clone()的方法,或者序列化。 2

java設計模式學習筆記--介面卡模式

1、什麼是介面卡模式 介面卡模式:將一個類的介面,轉換成客戶端 期望的另一個介面。介面卡讓原本介面不相容的類可以合作無間。 這個模式可以通過建立介面卡進行介面轉換,讓不相容的介面變成相容。可以讓客戶端從從實現的介面解耦,如果在一段時間後,想要改變介面,

設計模式學習筆記-原型模式

都是 tde 淺復制 posit osi 訪問 oid urn public 1. 概述   通過復制一個已經存在的實例來創建一個新的實例。被復制的實例被稱為原型,這個原型是可定制的。 2. 模式中的角色   2.1 抽象原型類(Abstract Prototype)

【大話設計模式讀書筆記——代理模式

oid write 實現 == str href proxy logs i++ 代理模式 代理者是指一個類別可以作為其它東西的接口。代理者可以作任何東西的接口:網絡連接、內存中的大對象、文件或其它昂貴或無法復制的資源。 維基百科-代理模式 代理模式實現遠程圖片加載 /

大話設計模式學習筆記-策略模式

策略模式 它定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化不會影響到使用演算法的客戶。 優點 策略模式是一種定義了一系列演算法的方法,從個概念上看,所有這些演算法完成的都是相同的工作。只是實現不同。他可以以相同的方式呼叫所有的演算法,減少了各種演算法類與使用演算法類之間的耦

大話設計模式學習筆記-裝飾模式

裝飾模式 動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。 裝飾模式結構演示 元件類:Component Component是定義一個物件介面,可以給這些物件動態地新增職責。 abstract class Component{ public abst

設計模式學習代理模式之靜態代理

設計模式學習之代理模式之靜態代理 前言 程式碼 執行結果 前言 最近發現設計模式都忘記的七七八八了,打算一邊寫一下部落格,一邊溫習一下設計模式,這裡因為最近寫了一下框架,模擬一下mybatis的代理方式 程式碼

設計模式學習代理模式

一.設計意圖:      為其他物件提供一種代理以控制對這個物件的訪問。 二.例子:      在公司中,客戶有需求都是向客服提,工程師則根據客服的反饋來修改產品。這時客服就是工程師們的代理。      1.首先建立統一介面         abstractimpl

設計模式學習--------12.代理模式學習

送禮物 遠程代理 查看 靜態 福爾摩斯 log cat eas and 場景: ? ? ?福爾摩斯一直想送禮物給花生,可是羞於直接贈送,於是想到讓房東太太去幫忙送禮物.編程怎樣實現呢

Java 設計模式學習筆記1——策略模式(Duck例子)

利用 實例化 top 而是 實現 學習筆記 left ng- 多個 0、假設現有工程(Duck)中遇到為類添加功能的問題,如何設計類添加新的功能? 1、利用繼承提供的Duck(鴨子)的行為會導致哪些缺點? (1)代碼在多個子類中重復 (2)很多男知道所有鴨子的全部行為

Java設計模式學習筆記,三:建造者模式

() stat sys pri builder 統一 return tengine str 建造者模式:實現了構建和裝配的解耦,即對象的各個子組件單獨構建,再進行裝配,從而建造完整對象。 該模式適用於構建較為復雜的對象(多個子組件)。 不同的構建者,使用相同的裝配者,可以建

java設計模式學習筆記(三) --- 行為型模式

文章目錄 責任鏈模式 策略模式 命令模式 直譯器模式 迭代器模式 中介者模式 備忘錄模式 觀察者模式 狀態模式 模板方法模式 訪問者模式 責任鏈模式 我獲取了一個物件,現在需要根據物件

java設計模式學習筆記(二)--- 結構型模式

文章目錄 介面卡模式 組合模式 裝飾模式 代理模式 什麼時候使用代理模式 享元模式 外觀模式(門面模式) 橋樑模式 介面卡模式 介面卡是一個介面轉換器,用於在接收不同的輸入時,得到一致

java設計模式學習筆記(一)--- 建立型模式

文章目錄 簡介 設計模式所遵循的幾個原則 一、工廠方法模式 簡單工廠模式 工廠方法模式 抽象工廠模式 工廠模式小結 單例模式 單例模式小結 建造者模式

JAVA設計模式學習筆記(一)

2018年11月03日 12:14:18 築夢^_^ 閱讀數:6 個人分類: JAVA

Java設計模式學習筆記(觀察者模式

觀察者模式說起來很簡單,就是一個訂報紙的模式。但是實際上這部分我覺得還是很有意思的,《Head First設計模式》裡還有一些還沒看完,也是因為理解的不夠深吧。     觀察者模式會包含兩個元件:觀察者和主題。     這段程式碼是主題的介面: package

Java設計模式學習筆記(單例模式

最近一直在看《Head First設計模式》,這本書寫的確實是很不錯的,專注於怎麼用最簡單的方式最通俗的語言讓人瞭解設計模式。據說GoF的設計模式那本書寫的很好,是一本經典,但是就是難懂,這本書應該就是我們這些一看經典書就困的人的寶貝了。     不過Head First系列並不專注於

java/android 設計模式學習筆記(10)---建造者模式

  這篇部落格我們來介紹一下建造者模式(Builder Pattern),建造者模式又被稱為生成器模式,是創造性模式之一,與工廠方法模式和抽象工廠模式不同,後兩者的目的是為了實現多型性,而 Builder 模式的目的則是為了將物件的構建與展示分離。Builder