2

考虑一个OriginalClass在运行时可能可用或不可用的类。OriginalClass有一个方法doSomething,如果它的类可用,则应该执行该方法。

解决这个问题的一种方法是创建一个类,该类也有一个doSomething调用OriginalClass.doSomethingusing 反射的方法。像这样的东西:

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) {}
        }
    }

}

这里应用的设计模式的名称是什么?我怀疑它是AdapterBridgeFacadeProxy,但我不确定是哪个。

4

3 回答 3

2

我会说这是代理模式

您已经创建了一个代理类,它包装了血淋淋的反射内容并将方法调用委托给不同的对象。

代理,在其最一般的形式中,是一个作为与其他事物的接口的类。代理可以连接到任何东西:网络连接、内存中的大对象、文件或其他一些昂贵或无法复制的资源。

您的模式与通过网络执行某些方法调用非常相似。

于 2011-06-20T19:11:53.177 回答
2

闻起来像我的代理。但是使用Java 的默认动态代理 API不是更好吗?

代理的定义:

代理强制对象方法调用通过代理对象间接发生,代理对象充当被代理的底层对象的代理或委托。代理对象通常被声明,以便客户端对象没有指示它们具有代理对象实例。

于 2011-06-20T19:12:54.497 回答
1

简单解释:

  • 适配器:当您有两个在语义上等效/相似但具有不同接口的类(A 和 B)时。适配器实现 A 的接口,但委托给 B,反之亦然,因此 A 和 B 可以互换使用
  • - 通常与整个继承树一起使用(虽然我从未使用过)
  • 外观- 将一个或多个类的复杂性隐藏在更简单的界面后面
  • 代理- 与目标对象相同的接口,委托给它,通常用于延迟加载和与目标解耦。

因此,您的代码示例看起来像Proxy

于 2011-06-20T19:16:24.907 回答