策略模式客户实施问题

时间:2019-11-19 17:17:32

标签: java strategy-pattern

目前,我有一种策略模式:

public interface EncryptionAlgorithm {
    String encrypt(String text);
}

public class Encrypter {
    private EncryptionAlgorithm encryptionAlgorithm;

    String encrypt(String text){
        return encryptionAlgorithm.encrypt(text);
    }

    public void setEncryptionAlgorithm(EncryptionAlgorithm encryptionAlgorithm) {
        this.encryptionAlgorithm = encryptionAlgorithm;
    }
}

public class UnicodeEncryptionAlgorithm implements EncryptionAlgorithm {
    @Override
    public String encrypt(String text) {
        return "";
    }
}

我希望Client成为将创建上下文的Cryptographer类(我也有一个解密器,与加密器相同),但是我在努力创建这些方法上很挣扎。

public class Cryptographer {

}

public class Main {
    public static void main(String[] args) {
        Cryptographer cryptographer = new Cryptographer();
        cryptographer.setCryptographer(new Encrypter());
        cryptographer.setAlgorithm(new UnicodeEncryptionAlgorithm());
    }
}

我试图使Cryptographer成为接口并由加密器实现方法,但没有成功。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

EncryptionAlgorithm是您的策略。所以这里的代码与您的代码相同。

public interface EncryptionAlgorithm {
    String encrypt(String text);
}

UnicodeEncryptionAlgorithm是具体策略,这里是相同的代码。具体策略可以有n种。

public class UnicodeEncryptionAlgorithm implements EncryptionAlgorithm {
    @Override
    public String encrypt(String text) {
        return "";
    }
}

根据您的要求,Cryptographer应该是上下文。我使CryptographerContext变得更有意义。如果需要,可以更改名称。

public class CryptographerContext {

    private EncryptionAlgorithm encAlgo;

    public void setEncryptionStrategy(EncryptionAlgorithm encAlgo) {
        this.encAlgo = encAlgo;
    }

    public String getEncryptedContents(String text) {
        return encAlgo.encrypt(text);
    }
}

在上述情况下,您必须使用抽象策略。

我在主要课程下面提供测试。如果有很多策略,则必须使用context.setStrategy(concrete impl class)为您的需求设置最合适的策略。

public class Main {
  public static void main(String[] args) {
    CryptographerContext cryptographer = new CryptographerContext();
    cryptographer.setEncryptionStrategy(new UnicodeEncryptionAlgorithm());
    String encText = cryptographer.getEncryptedContents("some text");
    System.out.println("Encrypted text: "+encText);
  }
}