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