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

Java 如何更改方法';根据调用它的应用程序的行为?,java,Java,我有一个通用的jar,它使用字符串的一些解组。根据调用它的应用程序的不同,该方法的行为应该有所不同。除了我可以通过尝试加载它拥有的某个唯一类来识别该应用程序这一事实之外(我不喜欢这样做)。有什么设计模式可以解决这个问题吗?正如我在评论中提到的,最好的办法是将uber方法分解成不同的方法来封装特定的行为,可能还有另一种方法(所有特定于应用的方法都使用)来处理常见的行为 最重要的是要记住,行为很重要。如果在不同的场景中有不同的行为,调用应用程序将无法有效地使用该方法,因为它无法控制发生的事情 如果您

我有一个通用的
jar
,它使用
字符串的一些解组。根据调用它的应用程序的不同,该方法的行为应该有所不同。除了我可以通过尝试加载它拥有的某个唯一类来识别该应用程序这一事实之外(我不喜欢这样做)。有什么设计模式可以解决这个问题吗?

正如我在评论中提到的,最好的办法是将uber方法分解成不同的方法来封装特定的行为,可能还有另一种方法(所有特定于应用的方法都使用)来处理常见的行为

最重要的是要记住,行为很重要。如果在不同的场景中有不同的行为,调用应用程序将无法有效地使用该方法,因为它无法控制发生的事情

如果您仍然希望所有应用程序调用的单个方法在每个方法中的行为都不同,那么您可以使用特定的设计模式,以合理且可维护的方式来实现。该模式称为“”

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


在某些情况下,同样的一般想法非常有效,可能适用于您的情况,但这样的问题需要非常深入地了解应用程序领域和体系结构,并且在您发布的问题中确实没有足够的信息进行深入挖掘。

事实上,我认为一个面向对象的好解决方案是,在公共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
    }
}
JarClass.createJarClass(this.getClass()).jarMethod();
至于调用者是如何工作的,如果您愿意设计代码,以便调用者掌握使用哪个派生类的知识,那么您显然只需要让调用者创建适当的派生类和调用方法

但是,我从您的问题中得出结论,您希望知道使用哪个类驻留在jar中。在这种情况下,有几种解决方案。但是一个相当简单的方法是在jar中定义一个工厂方法,它创建适当的派生类。因此,在抽象类中,您可以定义以下方法:

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
}
然后调用方只需执行以下操作:

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
    }
}
JarClass.createJarClass(this.getClass()).jarMethod();

您应该使用的“设计模式”就是不要让方法行为基于外部因素而改变!不同的行为应该是不同的方法。我支持@cdeszaq的评论。它要么是具有公共功能的公共jar,要么对于特定的应用程序具有特定的行为。如果您试图在外部jar中分离出公共代码,这是很好的。但是,您还必须编写代码,就像它不知道谁将调用它一样(避免代码中的逻辑循环引用)。