考虑一个类OriginalClass
,它可能在运行时可用,也可能不可用。CCD_ 2有一个方法CCD_。
解决此问题的一种方法是创建一个类,该类还具有使用反射调用OriginalClass.doSomething
的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) {}
}
}
}
这里应用的设计模式的名称是什么?我怀疑它是适配器、桥和立面或代理,但我不确定是哪一个。
我认为这是代理模式。
您已经创建了一个代理类,它封装了血腥的反射内容,并将方法调用委托给另一个对象。
代理,在其最通用的形式中,是一个充当其他对象接口的类。代理可以连接到任何东西:网络连接、内存中的大对象、文件或其他昂贵或不可能复制的资源
您的模式非常类似于在网络上执行某种方法调用。
对我来说闻起来像代理。但使用Java的默认动态代理API不是更好吗?
代理的定义:
代理强制对象方法调用通过代理间接发生对象,充当代理或基础对象的委托被代理。代理对象是通常是这样声明的对象没有表示它们有一个代理对象实例。
简单解释:
- 适配器:当您有两个类(A和B),它们在语义上等价/相似,但具有不同的接口时。适配器实现A的接口,但委托给B,反之亦然,因此A和B可以互换使用
- Bridge-通常与整个继承树一起使用(不过我从未使用过它)
- Facade-在更简单的接口后面隐藏一个或多个类的复杂性
- 代理-与目标对象相同的接口,委派给它,通常用于延迟加载和从目标解耦
因此,您的代码示例看起来像代理。