2011-06-20 49 views
2

考慮一個類OriginalClass,它可能會或可能不會在運行時提供。 OriginalClass有一個方法doSomething如果它的類可用,應該執行它。這種模式的名稱是什麼? (回答:遠程代理)

解決此問題的一種方法是創建一個類,該類還具有使用反射調用OriginalClass.doSomethingdoSomething方法。例如:

public class CompatibilityClass { 

    private static Method originalClass_doSomething = null; 

    static { 
     initCompatibility(); 
    }; 

    private static void initCompatibility() { 
     try { 
      originalClass_doSomething = Class.forName("originalClass").getMethod("doSomething", new Class[] {}); 
     } catch (NoSuchMethodException nsme) { 
     } catch (SecurityException se) { 
     } catch (ClassNotFoundException cnfe) {} 
    } 

    public static void doSomething() { 
     if (originalClass_doSomething != null) { 
      try { 
       originalClass_doSomething.invoke(null, new Object[]{}); 
      } catch (Exception e) {} 
     } 
    } 

} 

此處應用的設計模式的名稱是什麼?我懷疑這是無論適配器門面代理,但我不知道它。

+0

答案在答案字段中,而不是問題標題字段中。吉茲。 – BoltClock

+0

這是一種讓標題更有用的方法。如果不是,就沒有辦法將這個問題與其他問題區分開來「這種模式的名稱是什麼?」的問題。吉茲。 ;) – hpique

回答

2

我會說這是proxy pattern

您已經創建了一個代理類來包裝血腥的反射內容,並將方法調用委託給不同的對象。

代理是最通用的形式,它是一個可以作爲別的接口的類。代理可以連接任何東西:網絡連接,內存中的大型對象,文件或其他一些昂貴或不可能複製的資源。

您的模式與通過網絡執行某種方法調用等非常相似。

+0

那會是什麼樣的代理?遠程代理,即使原始類不完全是「遠程」? http://wiki.java.net/bin/view/Javapedia/ProxyPattern – hpique

+1

我同意你的建議。 –

+0

@hgpc,是的。遠程代理可能是這四者中最好的一個。就像在這種情況下一樣,我看到代理不符合這四種類別中的任何一種。 – aioobe

2

聞起來像代理給我。但是使用Java's default Dynamic Proxy API不是更好嗎?代理的

定義:

代理力對象方法調用到 發生間接通過代理 對象,其作爲替代或 委託被代理底層對象 。代理對象通常是 ,因此客戶端 對象沒有任何跡象表明它們的 有代理對象實例。

+0

+1不熟悉動態代理API。 – hpique

+0

雖然動態代理API如何使用靜態方法? – hpique

+0

@hgpc:你必須驗證這一點,但據我記得,代理通過一個接口工作。在哪裏委託調用無關緊要,靜態或實例方法... –

1

簡單的解釋:

  • 適配器:當你有兩個類(A和B)在語義上等價/相似,但有不同的接口。適配器實現,但代表的接口B或反之亦然所以A和B可以互換使用
  • - 通常與整個繼承樹使用(我從來沒有用過它雖然)
  • 門面 - 隱藏的複雜性在更簡單的接口之後的一個或多個類
  • 代理 - 與目標對象相同的接口,委託給它,通常用於延遲加載和從目標解耦。

因此,您的代碼示例看起來像一個代理