Junior
რა არის 'სტრატეგია' ნიმუში?
sobes.tech AI
პასუხი AI-სგან
სტრატეგიის ნიმუში (Strategy) განეკუთვნება ქცევით დიზაინის ნიმუშებს და საშუალებას აძლევს განსაზღვროს ალგორითმების ოჯახი, თითოეული მათგანის ინკაფსულაცია და მათ შორის ჩანაცვლება. ეს ნიმუში საშუალებას აძლევს შეცვალოს ალგორითმი დამოუკიდებლად მომხმარებლებისგან, რომლებიც მას იყენებენ.
ძირითადი მახასიათებლები:
- კონტექსტი: კლასი, რომელიც იყენებს ერთ-ერთ ალგორითმს. მას აქვს სიგნალი სტრატეგიის ინტერფეისზე.
- სტრატეგიის ინტერფეისი: განსაზღვრავს საერთო ინტერფეისს ყველა კონკრეტული სტრატეგიისთვის. კონტექსტი ურთიერთობს ამ ინტერფეისთან.
- კონკრეტული სტრატეგიები: ახორციელებენ სტრატეგიის ინტერფეისს, უზრუნველყოფენ კონკრეტულ ალგორითმის რეალიზაციას.
უპირატესობები:
- ადვილია ახალი სტრატეგიების დამატება, კონტექსტის კლასის შეცვლის გარეშე.
- ალგორითმები გამოყოფილია ცალკეულ კლასებში, რაც კოდს უფრო წასაკითხს და შენარჩუნებადს ხდის.
- მომხმარებელს შეუძლია აირჩიოს ალგორითმის რეალიზაცია შესრულების დროს.
iOS-ში გამოყენების მაგალითი:
მაგალითად, შეიძლება გამოიყენოთ სტრატეგია სხვადასხვა მეთოდების რეალიზაციისთვის მონაცემების ვალიდაციისთვის ტექსტურ ველში ან სხვადასხვა ალგორითმების განსაზღვრად ფასდაკლებების გამოთვლისთვის მაღაზიის აპლიკაციაში.
// სტრატეგიის ინტერფეისი
protocol ValidationStrategy {
func isValid(_ input: String) -> Bool
}
// კონკრეტული სტრატეგია: E-mail-ის ვალიდაცია
struct EmailValidationStrategy: ValidationStrategy {
func isValid(_ input: String) -> Bool {
// მარტივი ფორმატის შემოწმება
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