【问题标题】:What is the name of this pattern? (answer: Remote Proxy)这个图案叫什么名字? (答案:远程代理)
【发布时间】:2011-09-18 22:59:48
【问题描述】:

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

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

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,但我不确定是哪个。 p>

【问题讨论】:

  • 答案出现在答案字段中,而不是问题标题字段中。天哪。
  • 这是一种让标题更有用的方法。如果不是,则无法将此问题与其他“此模式的名称是什么?”区分开来。问题。哎呀。 ;)

标签: java design-patterns reflection proxy-pattern


【解决方案1】:

简单解释:

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

所以您的代码示例看起来像一个代理

【讨论】:

    【解决方案2】:

    对我来说闻起来像代理。但是使用Java's default Dynamic Proxy API 不是更好吗?

    代理的定义:

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

    【讨论】:

    • 动态代理 API 如何与静态方法一起工作?
    • @hgpc:您必须验证这一点,但据我所知,代理是通过接口工作的。您将调用委托给的位置无关紧要,静态或实例方法...
    【解决方案3】:

    我会说是proxy pattern

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

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

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

    【讨论】:

    • 那是什么样的代理呢?远程代理,即使原始类不完全是“远程”? wiki.java.net/bin/view/Javapedia/ProxyPattern
    • 我同意。您正在创建代理。
    • @hgpc,是的。远程代理可能是这四个中的最佳匹配。就像在这种情况下一样,我看到的代理并不真正适合这四个类别中的任何一个。
    • @hgpc:例如,我implemented the observer pattern 使用代理。呼叫被代理到所有听众。不知道如何调用这样的代理。 ;p
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2023-02-21
    • 1970-01-01
    • 2020-02-15
    • 2010-09-07
    相关资源
    最近更新 更多