我有多个需要编写的程序,它们共享共同的功能/资源。我希望看看我是否可以将这些程序的很大一部分放入库中。方案如下:
ProgA,ProgB和ProgC是使用libX的程序。
libX有一个类XYZ,它将实例化一个ABC类。
ProgA,ProgB和ProgC都有不同的ABC类实现。
如何构建我的程序来实现这一目标?我曾尝试做研究,但无法找到答案。提前谢谢......
答案 0 :(得分:0)
您可以在库中声明一个公共接口ABCInterface
,其中包含库的操作所需的所有方法。然后,您的不同程序将声明其类ABC
实现此接口,并将引用传递给库的方法。
如果您需要在库中实例化类(一次或多次),您可以将引用传递给工厂而不是类实例本身。以下代码可能会让您了解如何实现此类功能。
// Library code
interface ABCInterface {
public int getValue();
}
interface ABCFactory {
public ABCInterface createInstance();
}
class Library {
public static void doWork(ABCFactory factory) {
ABCInterface obj = factory.createInstance();
System.out.println(obj.getValue());
}
}
// Program code
class Program {
class ABCImplementation implements ABCInterface {
@Override
public int getValue() {
return 42;
}
}
public void useLibrary() {
Library.doWork(new ABCFactory() {
@Override
public ABCInterface createInstance() {
return new ABCImplementation();
}
});
}
}
答案 1 :(得分:0)
似乎你需要创建n inversion of control。
在这种情况下,你需要libX有一个指向接口ABC的指针,它具有你想要libX使用的所有功能,然后,progA,progB和progC必须实现这个接口。
当您启动程序时,您需要转到共享库并使用已知方法将正在运行的程序注入库中,例如:
setProgram(IMyInterface interface) {
this.interface = interface;
}
这样,当您想要运行已知的响应操作时,就会运行this.interface.doSomething()
,就是这样。
答案 2 :(得分:0)
您只需拥有一个基本库interface ABC
,它提供的界面允许您的XYZ
班级与班级A
,B
和{{1}进行互动这些都实现了C
。
interface ABC
您的库类只需要对实现public interface ABC {
public void method1();
public void method2();
}
的对象的引用。
interface ABC
然后,您的public class XYZ {
private ABC abc;
public XYZ(ABC abc) { this.abc = abc; }
}
,A
和B
实施要么实施C
,要么创建即时实施ABC的对象。
对我而言,这听起来很像回调计划。 Yor库需要一种标准方法来将结果传达给特定的实现。 ABC
基本上是一个事件处理程序接口。