1. 程式人生 > >JAVA設計模式(三)靜態與動態代理模式

JAVA設計模式(三)靜態與動態代理模式

  代理模式:為某個物件提供一個代理,以控制對這個物件的訪問。 代理類和委託類有共同的父類或父介面,這樣在任何使用委託類物件的地方都可以用代理物件替代。代理類負責請求的預處理、過濾、將請求分派給委託類處理、以及委託類執行完請求後的後續處理。
  通過上面的描述,我們知道在代理模式中存在三個角色。
代理介面:subject。
代理類:ProxySubject。
委託類:RealSubject。
代理類和委託類都實現了代理介面。代理類持有一個委託類的例項。

靜態代理

根據上面的描述,可以寫出一個簡單的代理模式Demo。
代理介面

public interface Subject {
    public
void doTast(); }

委託類

public class RealSubject implements Subject{

    @Override
    public void doTast() {
        // TODO Auto-generated method stub
        System.out.println("RealSubject doTast");
    }

}

代理類

public class ProxySubject implements Subject{

    private Subject delegate;

    public
ProxySubject(Subject delegate) { // TODO Auto-generated constructor stub this.delegate = delegate; } @Override public void doTast() { // TODO Auto-generated method stub System.out.println("ProxySubject doTast"); delegate.doTast(); } }

客戶端呼叫

        RealSubject mRealSubject = new
RealSubject(); ProxySubject mProxySubject = new ProxySubject(mRealSubject);//代理類去持有委託類的例項 mProxySubject.doTast();//代理類去執行任務

上面的方式就是靜態代理模式了,在程式碼執行前就已經存在了代理類的class編譯檔案。
優點:業務類只需要關注業務邏輯本身,保證了業務類的重用性。這是代理的共有優點。
缺點:
1)代理物件的一個介面只服務於一種型別的物件,如果要代理的方法很多,勢必要為每一種方法都進行代理,靜態代理在程式規模稍大時就無法勝任了。
2)如果介面增加一個方法,除了所有實現類需要實現這個方法外,所有代理類也需要實現此方法。增加了程式碼維護的複雜度。
除了靜態代理,JAVA還提供了動態代理。

動態代理

動態代理類是在程式執行期間由JVM根據反射等機制動態的生成,所以不存在代理類的位元組碼檔案。代理類和委託類的關係是在程式執行時確定。
JAVA提供了實現動態代理的API。我們先來看看動態代理實現步驟。
1. 實現InvocationHandler介面建立自己的呼叫處理器
2.建立動態代理。
3.動態建立代理類。
先來看看怎麼去建立自己的呼叫處理器

public class DynamicSubject implements InvocationHandler{

    private Object delegate;

    public DynamicSubject(Object delegate) {
        // TODO Auto-generated constructor stub
        this.delegate = delegate;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // TODO Auto-generated method stub
        Object result=method.invoke(delegate, args);
        return result;
    }

}

接下來對客戶端呼叫中程式碼做修改。

        Subject mRealSubject = new RealSubject();
        //建立動態代理
        DynamicSubject mDynamicSubject = new DynamicSubject(mRealSubject);

        ClassLoader loader=mRealSubject.getClass().getClassLoader();
        //動態建立代理類
        Subject ProxySubject = (Subject)Proxy.newProxyInstance(loader,new Class[]{Subject.class},mDynamicSubject);
        ProxySubject.doTast();

相關推薦

JAVA設計模式靜態動態代理模式

  代理模式:為某個物件提供一個代理,以控制對這個物件的訪問。 代理類和委託類有共同的父類或父介面,這樣在任何使用委託類物件的地方都可以用代理物件替代。代理類負責請求的預處理、過濾、將請求分派給委託類處理、以及委託類執行完請求後的後續處理。   通過上面的描述

初識keepalived——keepalivednginx代理實現高可用

keepalived nginx 背景介紹nginx除了可以作為web服務器外,同時也是一個反向代理軟件,nginx不能完全取代apache,所以很多場景下nginx作為apache的反向代理服務器。nginx運行在用戶空間,代替用戶向服務器發起請求,請求返回時再經由nginx服務器返回給用戶。不同於

Java框架學習_MybatisMybatis的動態代理模式

之前我們為了實現資料庫操作的封裝和業務的分離,使用Dao模式,現在Mybatis提供了更加簡潔的動態代理模式,只要有介面不需要實現,就能進行資料庫操作 動態代理模式必須遵循的規範: 與表相對應的mapper配置的namespace必須是介面的全路徑名 介面的方法名

Java代理模式3一CGLib動態代理

目錄 前言 Java代理模式(2)一動態代理中提到Java的動態代理只侷限於實現介面的實現類(RealSubject/RealSubject2都實現 ProblemInterface),儘管比起靜態代理優點有很多,但是實際業務中不是所有的類

Java提高班反射和動態代理JDK Proxy和Cglib

反射和動態代理放有一定的相關性,但單純的說動態代理是由反射機制實現的,其實是不夠全面不準確的,動態代理是一種功能行為,而它的實現方法有很多。要怎麼理解以上這句話,請看下文。 一、反射 反射機制是 Java 語言提供的一種基礎功能,賦予程式在執行時自省(introspect,官方用語)的能力。通過反射我們可

java設計模式模板模式

pro str pan style coff pub 調用 類定義 ted   抽象類中公開定義了執行它的方法的方式,子類可以按需求重寫方法實現,但調用將以抽象類中定義的方式進行,典型應用如銀行辦理業務流程、沖泡飲料流程。下面給出簡單例子,用沸水沖泡飲料,分為四步:將水煮沸

Java設計模式之建立型模式:單例模式

一、概念: java中單例模式是一種常見的設計模式,單例模式的寫法有好幾種,這裡主要介紹三種:懶漢式單例、餓漢式單例、登記式單例。 單例模式有以下特點: (1)單例類只能有一個例項; (2)單例類必須自己建立自己的唯一例項; (3)單例類必須給所有其他物件提供這一例項。 單例

Java設計模式

代理模式   代理模式為另一個物件提供一個替身或佔位符以控制對這個物件的訪問。   何為提供一個替身或佔位符?即一個物件代表另一個物件。有什麼事直接告訴代理物件,不必麻煩真正的物件,由代理物件來決定哪些事情去交給真正的物件。舉個例子,以前男女婚配,由男方家庭去拜託媒人,媒人轉告女方,此時媒人就是代理物件,

Java 設計模式:抽象工廠模式

參考連結:抽象工廠模式-Abstract Factory Pattern 工廠方法模式解決了簡單工廠模式存在的問題,但由於工廠方法模式中的每個工廠只生產一類產品,可能會導致系統中存在大量的工廠類,勢必會增加系統的開銷。此時,我們可以考慮將一些相關的產品組成一個“產品族”,由同一個工廠

《大話設計模式Java程式碼示例之裝飾模式

裝飾模式(Decorator):動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。 package decorator; /** * 裝飾模式(Decorator) * Person類 */ public class Perso

設計模式——java版》

三、抽象工廠模式         1.為建立一組相關或相互依賴的物件提供一個介面,而且無須指定它們的具體類。抽象工廠模式是工廠方法模式的升級版本。在有多個業務品種、業務分類時,通過抽象工廠模式產生需要的物件是一種非常好的解決方式。   &

Java設計模式模版方法模式

模版方法:在抽象類中定義了一個模版方法,在模版方法中使用了一些該抽象類中定義的空方法,而這些空方法可以供子類實現。 我們在檢視原始碼時經常能夠看到在執行一些重要的方法時,往往呼叫了一些看似沒有什麼意義的空方法。其實這就是模版方法。 abstract class Th

Unity3d設計模式工廠模式

這個系列的文章,並不會將所有用到的設計模式全部講一遍,事實上我個人認為,並不是所有的設計模式都適用於unity3d。這裡講的主要還是一些常用的設計模式。 那麼,本章講的就是常見的構建型模式當中的工廠模式。 簡單工廠模式 講工廠,首先得從簡單工廠說起。

抽象工廠Abstract Factory模式——Java設計模式

抽象工廠模式簡介 抽象工廠模式(Abstract Factory Pattern):圍繞一個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠。 分類:建立型模式。 在抽象工廠模式中,介面是負責

設計模式之迭代器組合模式

現在我們已經能愉快地看著一頁一頁羅列出來的選單進行點菜了。現在又有的小夥伴希望能夠加上一份餐後甜點的“子選單”。怎麼辦呢?我們不僅僅要支援多個選單,甚至還要支援選單中的選單。 如果我們能讓甜點選單變成餐廳選單集合的一個元素,那該有多好。但是根據現在的實現,根本做不到呀。我們想要的是這樣的: 我們需要什麼

設計模式 - 七大設計原則- 迪米特法則里氏替換原則

概述 簡單介紹一下七大設計原則: 開閉原則:是所有面向物件設計的核心,對擴充套件開放,對修改關閉 依賴倒置原則:針對介面程式設計,依賴於抽象而不依賴於具體 單一職責原則:一個介面只負責一件事情,只能有一個原因導致類變化 介面隔離原則:使用多個專門的介面,而不是使用一個總介面 迪米特法則(最少知道原則):

深入探索Java設計模式之裝飾器模式

裝飾器模式使你可以在執行時使用類似於物件組成的技術來裝飾類。這在我們希望例項化具有新職責的物件而無需對基礎類進行任何程式碼更改的情況下尤其有用。本文是在學習完優銳課JAVA架構VIP課程—【框架原始碼專題】中《學習原始碼中的優秀設計模式》後寫下的學習感悟。探討了這種模式,並向你展示瞭如何使用提供的Java程式

Java多線程編程模式實戰指南:Two-phase Termination模式

增加 row throws mgr 額外 finally join table 還需 停止線程是一個目標簡單而實現卻不那麽簡單的任務。首先,Java沒有提供直接的API用於停止線程。此外,停止線程時還有一些額外的細節需要考慮,如待停止的線程處於阻塞(等待鎖)或者等待狀態(等

設計模式裝飾者模式Decorator

不知道 operation 總結 界面 都是 per @override stat override   裝飾者模式針對的問題是:對一個結構已經確定的類,在不改變該類的結構的情況下,動態增加一些功能。   一般來說,都是對一些已經寫好的架構增加自己的功能,或者應對多種情況,

設計模式---抽象工廠模式

ava des 模式 println 5.5 mage test 抽象工廠 urn 1、 簡介:為創建一組相關或相互依賴的對象提供一個接口,無需指定它們的具體類。抽象工廠模式通常是用於創創建一族產品,並且這族產品分不同的等級;不同的具體工廠類生產不同等級的一族產品。 2、