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