Junior
Worum geht es beim Muster 'Strategie'?
sobes.tech KI
Antwort von AI
Das Muster "Strategie" gehört zu den Verhaltensmustern im Design und ermöglicht es, eine Familie von Algorithmen zu definieren, jeden von ihnen zu kapseln und sie austauschbar zu machen. Es erlaubt, den Algorithmus unabhängig von den Clients, die ihn verwenden, zu ändern.
Wichtige Punkte:
- Kontext: Die Klasse, die einen der Algorithmen verwendet. Sie enthält eine Referenz auf die Strategie-Schnittstelle.
- Strategie-Schnittstelle: Definiert eine gemeinsame Schnittstelle für alle konkreten Strategien. Der Kontext interagiert mit dieser Schnittstelle.
- Konkrete Strategien: Implementieren die Strategie-Schnittstelle und liefern eine konkrete Implementierung des Algorithmus.
Vorteile:
- Ermöglicht es, neue Strategien leicht hinzuzufügen, ohne die Kontextklasse zu ändern.
- Isoliert die Algorithmen in separaten Klassen, was den Code lesbarer und wartbarer macht.
- Ermöglicht es dem Client, die Implementierung des Algorithmus zur Laufzeit zu wählen.
Beispiel für die Verwendung in iOS:
Zum Beispiel kann die Strategie verwendet werden, um verschiedene Methoden der Eingabevalidierung in einem Textfeld zu implementieren oder um verschiedene Rabattberechnungsalgorithmen in einer Shop-App zu definieren.
// Strategie-Schnittstelle
protocol ValidationStrategy {
func isValid(_ input: String) -> Bool
}
// Konkrete Strategie: E-Mail-Validierung
struct EmailValidationStrategy: ValidationStrategy {
func isValid(_ input: String) -> Bool {
// Einfachste Überprüfung des E-Mail-Formats
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)
}
}
// Konkrete Strategie: Nicht-leere Zeichenkette Validierung
struct NonEmptyValidationStrategy: ValidationStrategy {
func isValid(_ input: String) -> Bool {
return !input.isEmpty
}
}
// Kontext
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)
}
}
// Verwendung
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