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