在线程环境java中解耦

时间:2015-03-28 18:10:44

标签: java multithreading design-patterns jar

我正面临着这种脱钩问题。让我用例子解释一下:

假设我有不同的类使用一些JAR。现在这个JAR不断更新,我们还需要更新我们的系统。现在,如果这个JAR略有变化,我必须对每个类进行更改,所以我们决定将它解耦。但是这些类以这样的方式调用JAR类,即它们创建它的对象,设置一些标志并在此基础上得到结果。因此,每个对象在每种方法中都有其重要性。

让我用简单的例子解释一下。

说我有一个X级

class X {
  Base base;
  public int getCalResult(int a, int b) {
     base = new Base();
     base.setA(a);
     base.setB(b);
     return base.getResult();
  }

  public int getCalResult2(int a, int b, int c) {
     base = new Base();
     base.setA(a);
     base.setB(b);
     base.setC(c);
     return base.getResult();
  }
}

class Base { This is some legacy class inside JAR so can't change this
  int a, b, c, d;
  public setA(int a) {
    this.a = a;
  }
  public getResult() {
    return a + b + c + d;
  }
}

如何解耦这种结构并使其同时保持线程安全。有什么指针吗?任何设计模式?

我希望所有对JAR的调用都必须保存在一个类中,这样如果JAR中有更改,我只需要处理单个类而不是所有它们

我做的是

引入BaseProxy

public class BaseProxy {
  Base b;
  public static newInstance() {
    b = new Base();
  }

  public static setABCD(int a, int b) {
    b.setA(a);
    b.setB(b);
  }
}

class X {
      public int getCalResult(int a, int b) {
         BaseProxy.newInstance();
         BaseProxy.setAB(a,b);
         return BaseProxy.getResult();
 }

  public int getCalResult2(int a, int b, int c) {
     BaseProxy.newInstance();
     BaseProxy.setABC(a,b,c);
     return BaseProxy.getResult();
  }
}

这可以在单线程env中工作,但不能在mutli中工作。我需要就此提出建议。任何其他更好的设计,我相信有。

1 个答案:

答案 0 :(得分:1)

很少有事情不清楚(或不理想) 1.当你说,jar中的遗留类得到更新时,是否会更改现有原型或添加新功能?如果他们不断更新定义,那么你就麻烦了。

要解决这个问题,一种方法是从遗留类中提取接口并定义实现它的委托(将其置于调用代码之外)并使用它在调用代码以减少直接依赖。现在,你的代表应该与传统课程进行对话。

此外,每当您的遗留类发生更改时,只需要更新代理端(除非被调用函数完全转换)