Junior
Kas ir 'Stratēģijas' modelis?
sobes.tech AI
Atbilde no AI
Stratēģijas šablons (Strategy) pieder uzvedības dizaina šabloniem un ļauj definēt algoritmu ģimeni, tos inkapsulēt un mainīt savstarpēji aizvietojami. Tas ļauj mainīt algoritmu neatkarīgi no klientiem, kas to izmanto.
Galvenie punkti:
- Konteksts: Klase, kas izmanto vienu no algoritmiem. Tā satur atsauci uz stratēģijas interfeisu.
- Stratēģijas interfeiss: Nosaka kopēju interfeisu visām konkrētajām stratēģijām. Konteksts ar šo interfeisu sadarbojas.
- Konkrētas stratēģijas: Īsteno stratēģijas interfeisu, nodrošinot konkrētu algoritma īstenojumu.
Priekšrocības:
- Ļoti viegli pievienot jaunas stratēģijas bez konteksta klases izmaiņām.
- Algoritmi ir izolēti atsevišķās klasēs, padarot kodu lasāmāku un uzturamu.
- Klients var izvēlēties algoritma īstenojumu izpildes laikā.
Piemērs iOS:
Piemēram, var izmantot stratēģiju, lai īstenotu dažādus datu ievades validācijas veidus vai dažādus algoritmus atlaides aprēķināšanai veikala lietotnē.
// Stratēģijas interfeiss
protocol ValidationStrategy {
func isValid(_ input: String) -> Bool
}
// Konkrēta stratēģija: E-pasta validācija
struct EmailValidationStrategy: ValidationStrategy {
func isValid(_ input: String) -> Bool {
// Vienkāršākā formāta pārbaude
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)
}
}
// Konkrēta stratēģija: Nepildīta virknes validācija
struct NonEmptyValidationStrategy: ValidationStrategy {
func isValid(_ input: String) -> Bool {
return !input.isEmpty
}
}
// Konteksts
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)
}
}
// Lietošana
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