Junior
Ποιο είναι το μοτίβο 'Στρατηγική';
sobes.tech AI
Απάντηση από AI
Το μοτίβο "Στρατηγική" ανήκει στα μοτίβα συμπεριφοράς σχεδίασης και επιτρέπει τον ορισμό μιας οικογένειας αλγορίθμων, την ενσωμάτωσή τους και την εναλλαγή τους. Επιτρέπει την αλλαγή του αλγορίθμου ανεξάρτητα από τους πελάτες που τον χρησιμοποιούν.
Βασικά σημεία:
- Πλαίσιο: Η κλάση που χρησιμοποιεί έναν από τους αλγόριθμους. Περιέχει μια αναφορά στη διεπαφή στρατηγικής.
- Διεπαφή Στρατηγικής: Ορίζει μια κοινή διεπαφή για όλες τις συγκεκριμένες στρατηγικές. Το πλαίσιο αλληλεπιδρά με αυτήν.
- Συγκεκριμένες Στρατηγικές: Υλοποιούν τη διεπαφή στρατηγικής, παρέχοντας μια συγκεκριμένη υλοποίηση του αλγορίθμου.
Πλεονεκτήματα:
- Επιτρέπει την εύκολη προσθήκη νέων στρατηγικών χωρίς να αλλάξει η κλάση πλαισίου.
- Απομονώνει τους αλγόριθμους σε ξεχωριστές κλάσεις, καθιστώντας τον κώδικα πιο ευανάγνωστο και εύκολα διαχειρίσιμο.
- Επιτρέπει στον πελάτη να επιλέξει την υλοποίηση του αλγορίθμου κατά την εκτέλεση.
Παράδειγμα χρήσης σε iOS:
Για παράδειγμα, μπορείτε να χρησιμοποιήσετε τη Στρατηγική για την υλοποίηση διαφορετικών τρόπων επικύρωσης εισόδου δεδομένων σε ένα πεδίο κειμένου ή για τον καθορισμό διαφορετικών αλγορίθμων υπολογισμού εκπτώσεων σε μια εφαρμογή καταστήματος.
// Διεπαφή Στρατηγικής
protocol ValidationStrategy {
func isValid(_ input: String) -> Bool
}
// Συγκεκριμένη Στρατηγική: Επικύρωση Email
struct EmailValidationStrategy: ValidationStrategy {
func isValid(_ input: String) -> Bool {
// Απλούστερος έλεγχος μορφής 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)
}
}
// Συγκεκριμένη Στρατηγική: Επικύρωση μη-κενής συμβολοσειράς
struct NonEmptyValidationStrategy: ValidationStrategy {
func isValid(_ input: String) -> Bool {
return !input.isEmpty
}
}
// Πλαίσιο
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)
}
}
// Χρήση
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