2011-06-20 52 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可以互换使用
  • - 通常与整个继承树使用(我从来没有用过它虽然)
  • 门面 - 隐藏的复杂性在更简单的接口之后的一个或多个类
  • 代理 - 与目标对象相同的接口,委托给它,通常用于延迟加载和从目标解耦。

因此,您的代码示例看起来像一个代理