Sobes.tech
Junior

Em que consiste o padrão 'Estratégia'?

sobes.tech IA

Resposta da IA

O padrão "Estratégia" pertence aos padrões comportamentais de design e permite definir uma família de algoritmos, encapsular cada um deles e torná-los intercambiáveis. Ele permite alterar o algoritmo independentemente dos clientes que o utilizam.

Pontos-chave:

  • Contexto: A classe que utiliza um dos algoritmos. Ela contém uma referência à interface de estratégia.
  • Interface de Estratégia: Define uma interface comum para todas as estratégias concretas. O contexto interage com essa interface.
  • Estratégias Concretas: Implementam a interface de estratégia, fornecendo uma implementação concreta do algoritmo.

Vantagens:

  • Permite adicionar novas estratégias facilmente sem modificar a classe de contexto.
  • Isola os algoritmos em classes separadas, tornando o código mais legível e fácil de manter.
  • Permite ao cliente escolher a implementação do algoritmo em tempo de execução.

Exemplo de uso em iOS:

Por exemplo, pode-se usar a Estratégia para implementar diferentes formas de validar a entrada de dados em um campo de texto ou para definir diferentes algoritmos de cálculo de descontos numa aplicação de loja.

// Interface de Estratégia
protocol ValidationStrategy {
    func isValid(_ input: String) -> Bool
}

// Estratégia Concreta: Validação de E-mail
struct EmailValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        // Verificação simples do formato de email
        let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
        let emailPredicate = NSPredicate(format:"SELF MATCHES %@", emailRegex)
        return emailPredicate.evaluate(with: input)
    }
}

// Estratégia Concreta: Validação de string não vazia
struct NonEmptyValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        return !input.isEmpty
    }
}

// Contexto
class Validator {
    private var strategy: ValidationStrategy

    init(strategy: ValidationStrategy) {
        self.strategy = strategy
    }

    func setStrategy(_ strategy: ValidationStrategy) {
        self.strategy = strategy
    }

    func validate(_ input: String) -> Bool {
        return strategy.isValid(input)
    }
}

// Uso
let emailValidator = Validator(strategy: EmailValidationStrategy())
print(emailValidator.validate("test@example.com")) // true
print(emailValidator.validate("invalid-email")) // false

let nonEmptyValidator = Validator(strategy: NonEmptyValidationStrategy())
print(nonEmptyValidator.validate("Hello")) // true
print(nonEmptyValidator.validate("")) // false