如何根据调用它的应用程序更改方法的行为?

时间:2012-03-15 14:59:25

标签: java

我有一个共同的jar,它使用了一些String对象的解组。该方法应该根据调用它的应用程序采取不同的行为,除了我可以通过尝试加载它具有的一些唯一类(不喜欢它)来识别应用程序之外,我该怎么做呢。是否有一些设计模式可以解决这个问题?

2 个答案:

答案 0 :(得分:3)

正如我在评论中提到的那样,最好的要做的就是将这种超级方法分解为封装特定行为的不同方法,也可能是另一种方法(由所有方法使用)处理常见行为的特定应用程序。

最重要的是要记住行为很重要。如果某些内容在不同的场景中表现不同,则调用应用程序实际上无法使用该方法,因为它无法控制发生的情况。

如果您仍然 希望拥有一个所有应用程序调用的方法,每个方法在每个方法中的行为都不同,那么可以使用某种设计模式执行此操作,以一种有意义且可维护的方式。该模式称为“Template Method”。

它的一般思想是调用应用程序传入一个逻辑块,被调用的方法包含它并在需要时调用。这与使用闭包的函数式编程或编程非常相似,在这些闭包中,您传递的逻辑块就像数据一样。虽然Java本身不支持闭包,但其他基于JVM的语言,如Groovy,Scala,Clojure,JRuby等,支持闭包。

在某些情况下,这个相同的一般概念非常强大,并且可能适用于您的情况,但是这样的问题需要非常了解应用程序域和体系结构以及在您发布的问题中确实没有足够的信息可以深入挖掘。

答案 1 :(得分:2)

实际上,我认为一个好的面向对象的解决方案在公共jar中有一个基类和几个派生类。基类将包含被调用方法的通用逻辑,每个派生类将包含特定行为。

所以,在你的jar中,你可能会有以下内容:

public abstact class JarClass {
    public method jarMethod() {
       //common code here        
    }
}

public class JarClassVersion1  extends JarClass {
    public method jarMethod() {
      // initiailzation code specific to JarClassVerion1
      super.jarMethod();
      // wrapup code specific to JarClassVerion1
    }
}

public class JarClassVersion2  extends JarClass {
    public method jarMethod() {
      // initiailzation code specific to JarClassVerion2
      super.jarMethod();
      // wrapup code specific to JarClassVerion2
    }
}

关于调用者如何工作,如果您愿意设计代码以便知道要使用哪个派生类与调用者一起使用,那么显然只需让调用者创建适当的派生类并调用jarMethod。 / p>

但是,我从你的问题中得到它,你想知道哪个类用于驻留在jar中。在这种情况下,有几种解决方案。但是一个相当容易的方法是在jar中定义一个工厂方法,它创建适当的派生类。因此,在抽象的JarClass中,您可以定义以下方法:

public static JarClass createJarClass(Class callerClass) {
   if (callerClass.equals(CallerClassType1.class)) {
       return new JarClassVersion1();
    } else if (callerClass.equals(CallerClassType2.class)) {
       return new JarClassVersion1();
       // etc. for all derived classess
}

然后调用者只需执行以下操作:

JarClass.createJarClass(this.getClass()).jarMethod();
相关问题