Junior
Нуқтаи намунаи 'Стратегия' чист?
sobes.tech AI
Ҷавоб аз AI
الگوی "استراتژی" (Strategy) به الگوهای رفتاری طراحی تعلق دارد و امکان تعریف خانوادهای از الگوریتمها، انکپسول کردن هر یک از آنها و جایگزینی آنها را فراهم میکند. این الگو امکان تغییر الگوریتم را مستقل از مشتریانی که از آن استفاده میکنند، میدهد.
نکات کلیدی:
- متن: کلاسی که یکی از الگوریتمها را استفاده میکند. این کلاس حاوی ارجاعی به رابط استراتژی است.
- رابط استراتژی: رابط مشترک برای تمام استراتژیهای خاص است. متن با این رابط تعامل دارد.
- استراتژیهای خاص: اینها رابط استراتژی را پیادهسازی میکنند و پیادهسازی خاصی از الگوریتم را ارائه میدهند.
مزایا:
- افزودن استراتژیهای جدید را بدون تغییر کلاس متن آسان میکند.
- الگوریتمها را در کلاسهای جداگانه جدا میکند، که کد را قابل خواندن و نگهداریتر میسازد.
- به مشتری اجازه میدهد تا پیادهسازی الگوریتم را در زمان اجرا انتخاب کند.
مثال در iOS:
برای مثال، میتوان از استراتژی برای پیادهسازی روشهای مختلف اعتبارسنجی ورودیهای داده در یک فیلد متن یا برای تعیین الگوریتمهای مختلف محاسبه تخفیفها در برنامه فروشگاه استفاده کرد.
// رابط استراتژی
protocol ValidationStrategy {
func isValid(_ input: String) -> Bool
}
// استراتژی خاص: اعتبارسنجی ایمیل
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