Sobes.tech
Junior

Kuo remiasi 'Strategijos' modelis?

sobes.tech AI

Atsakymas iš AI

Strategijos šablonas (Strategy) priklauso elgsenos dizaino šablonams ir leidžia apibrėžti algoritmų šeimą, juos inkapsuliuoti ir pakeisti vienas kitą. Jis leidžia keisti algoritmą nepriklausomai nuo klientų, kurie jį naudoja.

Pagrindiniai punktai:

  • Kontekstas: Klasė, kuri naudoja vieną iš algoritmų. Ji turi nuorodą į strategijos sąsają.
  • Strategijos sąsaja: Apibrėžia bendrą sąsają visoms konkrečioms strategijoms. Kontekstas sąveikauja su šia sąsaja.
  • Konkrečios strategijos: Įgyvendina strategijos sąsają, teikdamos konkrečią algoritmo įgyvendinimą.

Privalumai:

  • Lengva pridėti naujų strategijų be konteksto klasės keitimo.
  • Algoritmai izoliuoti atskiruose klasėse, todėl kodas tampa skaitomesnis ir palaikomas.
  • Leidžia klientui pasirinkti algoritmo įgyvendinimą vykdymo metu.

Pavyzdys iOS:

Pavyzdžiui, galima naudoti strategiją įvairių duomenų įvedimo patvirtinimo būdų įgyvendinimui arba skirtingų nuolaidų skaičiavimo algoritmų nustatymui parduotuvės programėlėje.

// Strategijos sąsaja
protocol ValidationStrategy {
    func isValid(_ input: String) -> Bool
}

// Konkreti strategija: El. pašto patvirtinimas
struct EmailValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        // Paprasčiausia el. pašto formato patikra
        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)
    }
}

// Konkreti strategija: Ne tuščios eilutės patvirtinimas
struct NonEmptyValidationStrategy: ValidationStrategy {
    func isValid(_ input: String) -> Bool {
        return !input.isEmpty
    }
}

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

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