Junior
Waar bestaat het patroon 'Strategie' uit?
sobes.tech AI
Antwoord van AI
Het patroon "Strategie" behoort tot de gedragsontwerppatronen en maakt het mogelijk om een familie van algoritmen te definiëren, elk te encapsuleren en uitwisselbaar te maken. Het stelt je in staat om het algoritme te wijzigen, onafhankelijk van de clients die het gebruiken.
Belangrijke punten:
- Context: De klasse die een van de algoritmen gebruikt. Het bevat een verwijzing naar de strategie-interface.
- Strategie-interface: Definieert een gemeenschappelijke interface voor alle concrete strategieën. De context interageert met deze interface.
- Concrete Strategieën: Implementeren de strategie-interface en bieden een concrete implementatie van het algoritme.
Voordelen:
- Maakt het gemakkelijk om nieuwe strategieën toe te voegen zonder de contextklasse te wijzigen.
- Isoleren de algoritmen in aparte klassen, waardoor de code beter leesbaar en onderhoudbaar wordt.
- Maakt het mogelijk voor de client om de implementatie van het algoritme tijdens de uitvoering te kiezen.
Voorbeeld van gebruik in iOS:
Bijvoorbeeld, je kunt de Strategie gebruiken om verschillende manieren van gegevensvalidatie in een tekstveld te implementeren of om verschillende algoritmen voor het berekenen van kortingen in een winkelapp te definiëren.
// Strategie-interface
protocol ValidationStrategy {
func isValid(_ input: String) -> Bool
}
// Concrete Strategie: E-mailvalidatie
struct EmailValidationStrategy: ValidationStrategy {
func isValid(_ input: String) -> Bool {
// Eenvoudige controle van het e-mailformaat
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)
}
}
// Concrete Strategie: Niet-lege string validatie
struct NonEmptyValidationStrategy: ValidationStrategy {
func isValid(_ input: String) -> Bool {
return !input.isEmpty
}
}
// Context
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)
}
}
// Gebruik
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