Sobes.tech
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