Sobes.tech
Junior

Mi a 'Stratégia' minta?

sobes.tech MI

Válasz az MI-től

A "Stratégia" minta a viselkedés tervezési minták közé tartozik, és lehetővé teszi egy algoritmus családjának meghatározását, mindegyikük inkapszulálását és cserélhetőségét. Lehetővé teszi az algoritmus független változtatását a felhasználóktól, akik azt használják.

Fő pontok:

  • Környezet: Az osztály, amely az egyik algoritmust használja. Tartalmaz egy hivatkozást a stratégia interfészére.
  • Stratégia interfész: Meghatározza az összes konkrét stratégia közös interfészét. A környezet ezzel az interfésszel lép kapcsolatba.
  • Konkrét stratégiák: Implementálják a stratégia interfészt, és konkrét megvalósítást nyújtanak az algoritmushoz.

Előnyök:

  • Könnyen hozzáadhatók új stratégiák anélkül, hogy módosítanánk a környezet osztályt.
  • Elkülönítik az algoritmusokat külön osztályokban, így a kód olvashatóbb és karbantarthatóbb lesz.
  • Lehetővé teszi az ügyfél számára, hogy a futási időben válassza ki az algoritmus megvalósítását.

Használati példa iOS-en:

Például a stratégiát használhatjuk különböző módokon az adatbevitel validálására egy szövegmezőben, vagy különböző algoritmusokat a kedvezmények számítására egy bolt alkalmazásában.

// Stratégia interfész
protocol ValidationStrategy {
    func isValid(_ input: String) -> Bool
}

// Konkrét stratégia: E-mail validáció
struct EmailValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        // Egyszerű ellenőrzés az email formátumára
        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ét stratégia: Nem üres sztring validáció
struct NonEmptyValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        return !input.isEmpty
    }
}

// Környezet
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)
    }
}

// Használat
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