Sobes.tech
Junior

Mis on 'Strateegia' muster?

sobes.tech AI

Vastus AI-lt

Strateegia muster (Strategy) kuulub käitumismustrite hulka ja võimaldab määratleda algoritmide perekonna, igaüht neist inkapsuleerida ning muuta need vahetatavateks. See võimaldab muuta algoritmi sõltumatult klientidest, kes seda kasutavad.

Peamised punktid:

  • Kontekst: Klass, mis kasutab üht algoritmidest. See sisaldab viidet strateegia liidesele.
  • Strateegia liides: Määratleb ühise liidese kõigile konkreetsetele strateegiatele. Kontekst suhtleb selle liidese kaudu.
  • Konkreetne strateegia: Teostab strateegia liidest, pakkudes konkreetset algoritmi rakendust.

Eelised:

  • Uute strateegiate lisamine on lihtne, ilma konteksti klassi muutmata.
  • Algoritmid on eraldatud eraldi klassidesse, muutes koodi loetavamaks ja hooldatavamaks.
  • Klient saab valida algoritmi rakenduse jooksvalt.

Näide iOS:

Näiteks võib kasutada strateegiat erinevate sisendi valideerimise meetodite rakendamiseks või erinevate allahindluste arvutamise algoritmide määratlemiseks poe rakenduses.

// Strateegia liides
protocol ValidationStrategy {
    func isValid(_ input: String) -> Bool
}

// Konkreetne strateegia: E-posti valideerimine
struct EmailValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        // Lihtne formaadi kontroll
        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)
    }
}

// Konkreetne strateegia: Mitte-tühi stringi valideerimine
struct NonEmptyValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        return !input.isEmpty
    }
}

// Kontekst
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)
    }
}

// Kasutamine
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