2

基本上我想要的是一个 JComboBox 来包含我已添加到我的应用程序中的加密算法列表。当用户从 JComboBox 中选择一个时,所选算法将存储在一个变量中。

我对目前实现这一目标的设置并不满意......

我有一个接口算法如下:

public interface Algorithm {
    public String encrypt(String text, Object[] key);
    public String decrypt(String text, Object[] key);
}

然后,我制定了实现此接口的特定算法并覆盖这些方法,例如:

public class CaesarCipher implements Algorithm {

    @Override
    public String encrypt(String text, Object[] key) {
        ...
    }

    @Override
    public String decrypt(String text, Object[] key) {
        ...
    }      
}

现在在我的 GUI 中,我有一个变量和 JComboBox,如下所示:

private Algorithm selectedAlgorithm;
private JComboBox algorithmsComboBox;

我希望 JComboBox 列出我添加的所有不同算法,但我不知道这样做的正确方法......

所以我做了一个这样的枚举:

public enum AlgorithmType {

    CAESAR_CIPHER("Caesar Cipher", new CaesarCipher());

    private final String name;
    private final Algorithm algorithm;

    private AlgorithmType(String name, Algorithm algorithm) {
        this.name = name;
        this.algorithm = algorithm;
    }

    public Algorithm getAlgorithm() {
        return algorithm;
    }

    @Override
    public String toString() {
        return name;
    }

}

然后与我的 JComboBox 一起使用,我做了这样的事情:

JComboBox<AlgorithmType> algorithmsComboBox = new JComboBox<AlgorithmType>(AlgorithmType.values());

我向我的 JComboBox 添加了一个 ActionListener 以将 selectedAlgorithm 变量设置为所选算法:

algorithmsComboBox.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        selectedAlgorithm = ((AlgorithmType)algorithmComboBox.getSelectedItem()).getAlgorithm();
    }

});

这可行,但我不确定将这样的对象存储在枚举中是否是一种好习惯,因为所有对象都是在枚举加载时不必要地创建的。有没有更好、更典型的方法来做到这一点?我可以想到一些替代方案,例如将每个算法存储在最终数组中,或者创建一个 AlgorithmFactory?或者,也许我不应该为每个算法创建单独的类,而只拥有一个算法类,它将 AlgorithmType 作为加密和解密方法的参数?

谢谢。

4

2 回答 2

0

如果您正在寻找模式,请尝试Strategy,否则如果实现算法的对象在运行时不更改,请尝试模板模式。

于 2013-10-31T17:42:48.983 回答
0

我不建议将对象存储在枚举中。相反,我建议制作一个键值对的映射,并使用枚举作为键,使用算法作为值。具体看AbstractMap.SimpleEntry<K,V>

于 2013-10-31T16:59:44.363 回答