【问题标题】:Architecture of Wizard type Image Processing App向导型图像处理应用程序的架构
【发布时间】:2012-08-13 03:19:23
【问题描述】:

我们正在构建一个向导式的图像处理软件。它由三层组成: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)并存储这些项(在数据.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”变得更短。

【问题讨论】:

    标签: java image-processing architecture layer


    【解决方案1】:

    您可以应用adapter pattern 来调用公共接口的不同实现,例如runAndGetResult()。结果是有尽可能多的具体实现来影响runAndGetResult()

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-20
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 2011-07-11
      • 2015-12-06
      • 1970-01-01
      相关资源
      最近更新 更多