Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida com padrão Strategy

Boa tarde, criei uma interface 'Sistema Operacional' e as classes 'Windows' (Foto 5) e 'Unix' (Foto 4) que implementam o método executarPrompt(). Mas, surgiu uma dúvida na Foto 3 (parte circulada), pois, eu preciso saber qual é o sistema operacional para instanciar a classe, mas, eu não queria utilizar if.

Por exemplo:

  • Linux: prompt.executar(tempo, new Unix());
  • Windows: prompt.executar(tempo, new Windows());

Foto 1: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Foto 2: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Foto 3: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Foto 4: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Foto 5: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

3 respostas

Oi Augusto,

O sistema operacional voce gostaria de "descobrir" automatico da maquina que esta rodando? Ou o usuario poderia indicar de alguma maneira por parametro?

Boa tarde, Rodrigo...

Eu gostaria de "descobrir" automaticamente, utilizando o System.getProperty("os.name").

solução!

Blz!

Pois é, o codigo ficaria tipo assim:

String os = System.getProperty("os.name");

if (os.equals("windows")) {
    prompt.executar(tempo, new Windows());
} else if (os.equals("linux")) {
    prompt.executar(tempo, new Linux());
} else {
    prompt.executar(tempo, new MacOS());    
}

E para evitar esses if/else voce pode aplicar o pattern strategy utilizando um enum:

public enum SistemasOperacionais {

    WINDOWS("Windows"),
    LINUX("Linux"),
    MAC_OS("Mac OS");

    private final String nome;

    private SistemasOperacionais(String nome) {
        this.nome = nome;
    }

    public static SistemaOperacional comNome(String nome) {
        return Arrays.stream(SistemasOperacionais.values())
            .filter(so -> so.nome.equals(nome))
            .findFirst()
            .orElseThrow(() -> new IllegalArgumentException("Nome do OS invalido!"));
    }

}
String nomeOs = System.getProperty("os.name");
prompt.executar(tempo, SistemasOperacionais.comNome(nomeOs));

Obs: precisa colocar nas constantes do enum a String com o nome correto do SO devolvido pelo System.getProperty("os.name")