我需要编写多个共享通用功能/资源的程序。我正在寻找是否可以将这些程序的很大一部分放入库中。场景如下:
ProgA、ProgB 和 ProgC 是使用 libX 的程序。
libX 有一个类 XYZ,它将实例化一个类 ABC。
ProgA、ProgB 和 ProgC 都有 ABC 类的不同实现。
我如何构建我的程序来实现这一点?我试图进行研究,但无法找到答案。提前致谢...
您可以在您的库中声明一个公共接口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();
}
});
}
}
似乎你需要创建 n个控制反转。
在这种情况下,您需要 libX 具有指向接口 ABC 的指针,该接口具有您希望 libX 使用的所有功能,然后 progA、progB 和 progC 必须实现此接口。
当您启动程序时,您需要转到共享库并使用已知方法将正在运行的程序注入到库中,例如:
setProgram(IMyInterface interface) {
this.interface = interface;
}
这样,当您想运行已知的响应操作时,您就运行了this.interface.doSomething()
,仅此而已。
您将拥有一个基本库,该库interface ABC
提供了允许您的XYZ
类与类交互的接口A
,B
并且所有这些类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
或创建动态实现 ABC 的对象。
对我来说,这听起来很像回调方案。你的库需要一种标准的方式来将结果传达给特定的实现。ABC
基本上是一个事件处理程序接口。