Sobes.tech
Junior

¿En qué consiste el patrón 'Estrategia'?

sobes.tech AI

Respuesta de la IA

El patrón "Estrategia" se refiere a patrones de comportamiento en el diseño y permite definir una familia de algoritmos, encapsular cada uno de ellos y hacer que sean intercambiables. Permite cambiar el algoritmo independientemente de los clientes que lo utilizan.

Puntos clave:

  • Contexto: La clase que utiliza uno de los algoritmos. Contiene una referencia a la interfaz de estrategia.
  • Interfaz de Estrategia: Define una interfaz común para todas las estrategias concretas. El contexto interactúa con esta interfaz.
  • Estrategias Concretas: Implementan la interfaz de estrategia, proporcionando una implementación concreta del algoritmo.

Ventajas:

  • Permite agregar nuevas estrategias fácilmente sin modificar la clase de contexto.
  • Aísla los algoritmos en clases separadas, haciendo el código más legible y mantenible.
  • Permite al cliente elegir la implementación del algoritmo en tiempo de ejecución.

Ejemplo de uso en iOS:

Por ejemplo, se puede usar la Estrategia para implementar diferentes formas de validar la entrada de datos en un campo de texto o para definir diferentes algoritmos de cálculo de descuentos en una aplicación de tienda.

// Interfaz de Estrategia
protocol ValidationStrategy {
    func isValid(_ input: String) -> Bool
}

// Estrategia Concreta: Validación de E-mail
struct EmailValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        // Validación simple del 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)
    }
}

// Estrategia Concreta: Validación de cadena no vacía
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