我正在开发一个必须从屏幕读取某些数据的应用程序,为此我使用常量类来指定屏幕中数据的位置。例如,一个包含信息的变量如下所示:
//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}};
我将需要使用这些常量发送有关每个类的分辨率的信息。此外,当添加更多不同的分辨率时,这个类将变得非常大。
int [] getUsername();
int [] [] getCommonNumbers();
然后,对于每个分辨率,我都会实现这个接口,每当我的应用程序启动时,我都会用spring设置正确的实现。
我想知道这个问题的优秀设计是什么,因为我并不完全相信这些解决方案。是否有一些设计模式?
我正在阅读有关Constant接口的内容,但我不确定如何在此处应用它。
答案 0 :(得分:1)
这看起来不像常量。它似乎更像是配置。常量是 从不 更改的内容。在这种情况下,组件的确切位置可能会随着时间的推移而改变。
你应该提取一个类似于:
的类class ComponentPositions {
Rectangle getUsernamePosition();
Set<Rectangle> getCommonNumbersPositions();
[...]
}
您可以让此类的多个实例具有不同的值。将值加载到此类是您必须解决的另一个问题,但您可以引入一个Factory(可能称为ComponentPositionConfiguration
),它将能够加载该配置的不同实例。