Sobes.tech
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