向导型图像处理应用程序的体系结构

时间:2012-08-13 03:19:24

标签: java image-processing architecture layer

我们正在构建一个向导式图像处理软件。它由三层组成:GUI,Engine和Core_Algorithms。

向导:应用的每个“面板”都会要求用户执行某些操作。示例:第一个面板要求用户加载一些图像,下一个面板应用“种子区域增长”(SRG)算法,并要求用户使用“魔棒工具”调整结果。

场景背后会发生什么:所有算法都保存在“核心”包中(并且完全独立于GUI)。所有数据项(针对整个应用程序)都存储在单个类中( Data.java )。

Data.java

/*Stores ALL the necessary data items*/
public class Data{

    BufferedImage sourceImage, targetImage;
    BufferedImage srcGrownImg;
    Point srcPoint, tarPoint;//and many more data items for each algorithm and panel
}

另一个类( Engine.java ,从Data.java扩展)使用这些数据项,运行适当的算法(如“core”包中的SRG.java)并存储项目(内部) Data.java)。 向导的每个阶段都有相同的“Engine.java”实例,因此他们可以设置,运行算法并获得结果。

Engine.java

/*Runs algorithms inside "core"*/
public class Engine extends Data{
    public growSource()
    {
        SRG srgObj = new SRG(srcImg, srcSeeds);
        srcGrownImg = srgObj.runAndGetResult();
    }//and many more functions for each panel
}

问题:我们遇到的问题是“Data.java”和“Engine.java”太长了。 Engine.java由短而甜的函数组成(3-4行)(但整个向导使用的所有函数都存储在其中,从而使它非常长)。

问题:我想知道如何破解代码,以便“Data.java”和“Engine.java”变短。

1 个答案:

答案 0 :(得分:1)

您可以应用adapter pattern来唤起公共接口的不同实现,例如runAndGetResult()。结果是有尽可能多的具体实现,因为有方法可以实现runAndGetResult()

这个example说明了单个抽象函数eval()的模式,但可以实现多个接口。 class literal用作运行时类型令牌以按名称获取实现,但也可以使用注册表。

在GUI中,适配器可能会扩展AbstractAction以用于按钮,菜单项和接受Action的其他组件。对于离线处理,可以在GUI中组合适配器列表,然后在另一个线程中按照规定的顺序进行评估。