常量类

时间:2015-08-12 09:27:34

标签: java spring oop design-patterns

我正在开发一个必须从屏幕读取某些数据的应用程序,为此我使用常量类来指定屏幕中数据的位置。例如,一个包含信息的变量如下所示:

//Square of 100x15 px containing the name of the current user
public static final int[] USERNAME = {1157, 700, 100, 15};
//Squares for the five 16x23 numbers common to all players 
private static final int[][] COMMON_NUMBERS = {
            {426, 230, 16, 23},
            {514, 230, 16, 23},
            {601, 230, 16, 23},
            {688, 230, 16, 23},
            {775, 230, 16, 23}};

使用这个类的一个例子是:

BufferedImage username = screenshot.getSubimage(Constants.USERNAME[0], Constants.USERNAME[1], Constants.USERNAME[2], Constants.USERNAME[3]);

到目前为止一切都很好,但现在我需要更多的常量表示相同的东西,但是对于不同的屏幕分辨率。我无法乘以屏幕分辨率的比例,因为某些元素的位置略有不同,有时读数也不正确。
我想知道这种情况是否有一个漂亮而干净的设计模式我可以使用,因为我并不完全相信我想到的不同选择:

  • 将分辨率添加为变量的新维度,例如上面的示例将是这样的:
  

public static final int [] [] USERNAME = {{1157,700,100,15},{1100,   650,100,15}};

我将需要使用这些常量发送有关每个类的分辨率的信息。此外,当添加更多不同的分辨率时,这个类将变得非常大。

  • 使用包含所有属性的getter的接口,例如:
  

int [] getUsername();
  int [] [] getCommonNumbers();

然后,对于每个分辨率,我都会实现这个接口,每当我的应用程序启动时,我都会用spring设置正确的实现。

  • 使用中间类而不是包含有关要使用的分辨率的信息的接口,将包含所有方法作为上一个接口,并将从正确的常量文件返回该属性。这可以通过手动实现所有方法或使用java反射来完成,这样一个中心方法就可以处理所有调用。这样每当我想使用我的常量时,我​​都会调用中间类。

我想知道这个问题的优秀设计是什么,因为我并不完全相信这些解决方案。是否有一些设计模式?
我正在阅读有关Constant接口的内容,但我不确定如何在此处应用它。

1 个答案:

答案 0 :(得分:1)

这看起来不像常量。它似乎更像是配置。常量是 从不 更改的内容。在这种情况下,组件的确切位置可能会随着时间的推移而改变。

你应该提取一个类似于:

的类
class ComponentPositions {
  Rectangle getUsernamePosition();
  Set<Rectangle> getCommonNumbersPositions();
  [...]
}

您可以让此类的多个实例具有不同的值。将值加载到此类是您必须解决的另一个问题,但您可以引入一个Factory(可能称为ComponentPositionConfiguration),它将能够加载该配置的不同实例。