Strategy — bu nima, iOS va Android da strategiya naqshi

Muallif: IT Sectr Nashr etilgan: 2026-02-18 O'qish vaqti: 9 daq

Strategy (Strategiya) — bir-birini almashtiruvchi algoritmlar oilasini belgilaydigan va ularning har birini alohida sinfga (Strategy) joylashtiradigan xatti-harakat dizayn naqshidir. Naqsh algoritmni uchish vaqtida tanlash imkonini beradi: mijoz kodi umumiy Strategy interfeysi orqali ishlaydi, aniq tatbiq esa ishga tushirish vaqtida qo'shiladi. iOS da naqsh Protocol + strategiya sinflari orqali, Android da esa Interface + tatbiqlar orqali amalga oshiriladi. Strategy — 23 GoF naqshidan biri, to'lovlarni qayta ishlash, tekshirish, saralash va ma'lumotlarni filtrlash uchun keng qo'llaniladi. Batafsil — GoF asl tavsifida.

Asosiy

  • Strategy — bir-birini almashtiruvchi algoritmlar oilasi uchun GoF xatti-harakat naqshi
  • Algoritmlarni inkapsulyatsiyasi — har bir algoritm o'z sinfida izolyatsiya qilingan
  • Strategy interfeysi — barcha aniq strategiyalar tatbiq qiladigan umumiy shartnoma
  • Meros olish o'rniga kompozitsiya — kontekst strategiyaga havola saqlaydi, xatti-harakatni meros olmaydi
  • Open/Closed printsipi — yangi strategiyalar mavjud kodni o'zgartirmasdan qo'shiladi

Strategy naqshi nima: mohiyati va tuzilishi

Strategy — 23 GoF (Gang of Four) naqshidan biri, «Design Patterns: Elements of Reusable Object-Oriented Software» (1994) kitobida tasvirlangan. Naqsh ishga tushirish vaqtida algoritm tanlash muammosini hal qiladi. Ko'plab shart operatorlari (if-else, switch) bo'lgan bitta sinf yozish o'rniga, Strategy har bir algoritmni umumiy interfeys bilan alohida sinfga ajratishni taklif qiladi. Kontekst (strategiyadan foydalanadigan sinf) Strategy interfeysiga havola saqlaydi va bajarishni aniq strategiyaga topshiradi.

Naqshning tuzilishi uch elementni o'z ichiga oladi: Context (kontekst) Strategy ga havola saqlaydi va uning metodini chaqiradi; Strategy (interfeys) barcha algoritmlar uchun umumiy metodni e'lon qiladi; ConcreteStrategy (aniq strategiya) interfeysni tatbiq qiladi va aniq algoritmni o'z ichiga oladi. Mijoz kerakli strategiyani yaratadi va uni konstruktor, setter yoki metod parametri orqali kontekstga uzatadi. Kontekst qaysi strategiya bajarilayotganini bilmaydi — faqat interfeys bilan ishlaydi.

KomponentRolMisol
ContextStrategy ga havola saqlaydiPaymentProcessor, Sorter
StrategyAlgoritmlar uchun umumiy interfeysProtocol PaymentStrategy
ConcreteStrategyAlgoritmning aniq tatbiqiCardPayment, PayPalPayment

Open/Closed printsipi — Strategy ning asosiy afzalligi. Tizim kengaytirish uchun ochiq (yangi strategiya qo'shish mumkin) va o'zgartirish uchun yopiq (kontekst kodini o'zgartirish shart emas). Naqshsiz yangi algoritm qo'shish mavjud sinfni o'zgartirishni talab qiladi, bu OCP ni buzadi va regressiv xatolar xavfini oshiradi. Strategy sinflar hajmini ham kamaytiradi: 200 qatorli switch-case sinfi o'rniga har biri 20 qatordan iborat 6 sinf olinadi.

iOS da Strategy: Swift bilan Protocol orqali tatbiqi

Swift da Strategy Protocol (strategiya interfeysi) va sinf yoki struktur-strategiyalar orqali tatbiq qilinadi. Swift protokollari associated types va generic constraints ni qo'llab-quvvatlaydi, bu strategiyalarni loyihalashda moslashuvchanlik beradi. Kontekst odatda ViewModel sinfi yoki strategiyani init yoki xususiyat orqali qabul qiladigan xizmatdir. Naqsh iOS loyihalarida hodisalarni qayta ishlash, animatsiyalar, ma'lumotlarni formatlash va UI strategiyalari uchun keng qo'llaniladi.

swift
// 1. Protocol Strategy
protocol PaymentStrategy {
    func pay(amount: Decimal) async throws -> PaymentResult
}

// 2. Aniq strategiyalar
struct CardPaymentStrategy: PaymentStrategy {
    let cardNumber: String
    let cvv: String

    func pay(amount: Decimal) async throws -> PaymentResult {
        // Bank API siga so'rov yuborish
        return PaymentResult(status: .success, transactionId: "tx_\(UUID())")
    }
}

struct PayPalPaymentStrategy: PaymentStrategy {
    let email: String

    func pay(amount: Decimal) async throws -> PaymentResult {
        // PayPal SDK ga yo'naltirish
        return PaymentResult(status: .success, transactionId: "pp_\(UUID())")
    }
}

// 3. Context
class PaymentProcessor {
    private var strategy: PaymentStrategy

    init(strategy: PaymentStrategy) {
        self.strategy = strategy
    }

    func setStrategy(_: PaymentStrategy) {
        strategy = strategy
    }

    func processPayment(amount: Decimal) async throws -> PaymentResult {
        return try await strategy.pay(amount: amount)
    }
}

// Foydalanish
let processor = PaymentProcessor(strategy: CardPaymentStrategy(cardNumber: "4111...", cvv: "123"))
let result = try await processor.processPayment(amount: 99.99)

SwiftUI da Strategy — naqsh MVVM bilan tabiiy ravishda integratsiyalanadi. ViewModel strategiya xususiyatini o'z ichiga oladi va foydalanuvchi harakati paytida uning metodini chaqiradi. SwiftUI View ma'lumotlarni @Published yoki @State orqali oladi — strategiya tatbiq detallarini View dan yashiradi. Masalan, matn tekshirish strategiyasi (emailValidator, phoneValidator) kiritish maydoni turiga qarab almashtiriladi. Strategy ni SwiftUI bilan birlashtirish UIKit dan meros olishsiz moslashuvchanlik beradi.

Android da Strategy: Kotlin bilan Interface orqali tatbiqi

Kotlin da Strategy til darajasida Interface va soddalashtirish uchun funksional interfeyslardan (SAM) foydalanadi. Kotlin lambdalarni qo'llab-quvvatlaydi, bu alohida strategiya sinfini e'lon qilmasdan algoritmlarni funksiya sifatida uzatish imkonini beradi. Android da naqsh ViewModel va Use Cases da ma'lumotlarni yuklash, keshlash va xatolarni boshqarish algoritmlarini izolyatsiya qilish uchun qo'llaniladi. Clean Architecture bilan Android loyihalari bayroqlarga (mock, real, cache) qarab repository ning turli tatbiqlarini inyeksiya qilish uchun Strategy dan foydalanadi.

kotlin
// 1. Interface Strategy
interface PaymentStrategy {
    suspend fun pay(amount: BigDecimal): PaymentResult
}

// 2. Aniq strategiyalar
class CardPaymentStrategy(
    private val cardNumber: String,
    private val cvv: String
) : PaymentStrategy {
    override suspend fun pay(amount: BigDecimal): PaymentResult {
        // Retrofit orqali Bank API
        return PaymentResult(success = true, transactionId = "tx_${UUID.randomUUID()}")
    }
}

class PayPalPaymentStrategy(
    private val email: String
) : PaymentStrategy {
    override suspend fun pay(amount: BigDecimal): PaymentResult {
        // PayPal SDK integration
        return PaymentResult(success = true, transactionId = "pp_${UUID.randomUUID()}")
    }
}

// 3. Context
class PaymentProcessor(
    private val strategy: PaymentStrategy
) {
    fun setStrategy(strategy: PaymentStrategy): PaymentProcessor {
        return PaymentProcessor(strategy)
    }

    suspend fun processPayment(amount: BigDecimal): PaymentResult {
        return strategy.pay(amount)
    }
}

// ViewModel da foydalanish
class CheckoutViewModel : ViewModel() {
    private var processor = PaymentProcessor(CardPaymentStrategy("4111...", "123"))

    fun payWithCard() {
        viewModelScope.launch {
            val result = processor.processPayment(BigDecimal("99.99"))
            // Natijani qayta ishlash
        }
    }
}

Hilt/Dagger bilan Strategy — Android loyihalarida strategiyalar ko'pincha DI orqali inyeksiya qilinadi. Hilt @Binds yoki @Provides orqali PaymentStrategy ning aniq tatbiqini ta'minlaydi. Bu kontekst kodini o'zgartirmasdan strategiyani o'zgartirish imkonini beradi — boshqa kompilyatsiya (debug/release) uchun DI modulini o'zgartirish kifoya. Masalan, disk raskadrovka uchun MockPaymentStrategy, ishlab chiqarish uchun esa haqiqiy bank strategiyasi inyeksiya qilinadi. Strategy + DI kombinatsiyasi maksimal moslashuvchanlik beradi.

Strategy ni State, Command va Template Method bilan solishtirish

Strategy vs State — tuzilish jihatidan naqshlar bir xil: ikkalasi ham interfeys va aniq sinflar bilan kompozitsiyadan foydalanadi. Farq maqsadda: Strategy mustaqil algoritmni tanlaydi, State obyektning holatiga qarab uning xatti-harakatini boshqaradi. State da kontekst holat o'zgarganda strategiyani o'zi o'zgartiradi, Strategy da kontekst o'tishni boshqarmaydi — mijoz algoritmni aniq belgilaydi. Strategiyalar bir-biri haqida bilmaydi, holatlar esa bir-biriga o'tishi mumkin.

Strategy vs Command — Command bitta harakatni obyekt sifatida inkapsulyatsiya qiladi, Strategy bir-birini almashtiruvchi algoritmlar to'plamini inkapsulyatsiya qiladi. Command — «nima qilish kerak» (bitta execute chaqiruvi), Strategy — «qanday qilish kerak» (bir necha bosqichli algoritm). Command navbatlar, kechiktirilgan bajarish, undo/redo uchun ishlatiladi. Strategy — ish vaqtida topshiriqni bajarish usulini tanlash uchun. Komandalar strategiyalar bilan parametrlanishi mumkin, ikkala naqshni birlashtirib.

XususiyatStrategyStateCommandTemplate Method
MaqsadBir-birini almashtiruvchi algoritmlarHolatga bog'liq xatti-harakatSo'rovni inkapsulyatsiyasiAlgoritm skeleti
O'zgarishMijoz tomonidan aniqKontekst tomonidan avtomatikMijoz yoki navbat bilanMeros olish bilan
DarajaObyekt (kompozitsiya)Obyekt (kompozitsiya)ObyektSinf (meros olish)

Strategy vs Template Method — ikkala naqsh ham algoritmlarni belgilaydi, lekin turli usullar bilan. Template Method meros olishdan foydalanadi: asosiy sinf algoritm skeletini (shablon metod) belgilaydi, pastki sinflar alohida qadamlarni bekor qiladi. Strategy kompozitsiyadan foydalanadi: algoritm butunlay alohida sinfga chiqarilgan. Template Method algoritmning sobit tuzilishiga ega holatlar uchun soddaroq, Strategy — algoritmlar butunlay farqli va dinamik o'zgarishi mumkin bo'lganda.

Strategy naqshidan real foydalanish misollari

To'lovlarni qayta ishlash — Strategy ning klassik misoli. Internet-do'kon savati mahsulotlar ro'yxatini o'z ichiga oladi, to'lov usuli esa foydalanuvchi tomonidan tanlanadi. Har bir usul (karta, PayPal, Apple Pay, Google Pay, kriptovalyuta) — pay(amount) umumiy imzosi bilan alohida strategiya. PaymentProcessor konteksti to'lov qanday amalga oshirilayotganini bilmaydi — umumiy metodni chaqiradi. Yangi to'lov usulini qo'shish savat kodini o'zgartirishni talab qilmaydi.

Ma'lumotlarni tekshirish — Strategy bir maydonning turli tekshirish qoidalari uchun qo'llaniladi. EmailValidatorStrategy, PhoneValidatorStrategy, AgeValidatorStrategy validate(input) metodi bilan umumiy ValidationStrategy interfeysini tatbiq qiladi. Ro'yxatdan o'tish formasi har bir maydonni tekshirish uchun strategiyalar to'plamidan foydalanadi. Tekshirish strategiyalari zanjir (Chain of Responsibility) bilan birlashtirilishi yoki siklda hammasi birdan qo'llanilishi mumkin. Bu uzun if-else tekshiruvlarini polimorfik tekshirgichlar to'plami bilan almashtiradi.

swift
// Saralash strategiyasi
protocol SortingStrategy {
    func sort<T>(_ items: [T]) -> [T] where T: Comparable
}

struct QuickSortStrategy: SortingStrategy {
    func sort<T>(_ items: [T]) -> [T] { /* quicksort */ items }
}

struct MergeSortStrategy: SortingStrategy {
    func sort<T>(_ items: [T]) -> [T] { /* mergesort */ items }
}

class SortedDataSource<T> {
    private var strategy: SortingStrategy
    func display(_ items: [T]) { let sorted = strategy.sort(items) }
}

Autentifikatsiya — mobil ilovalarda autentifikatsiya strategiyalari provayderga qarab o'zgaradi. login(), logout(), getToken() metodlari bilan AuthStrategy EmailPasswordAuth, GoogleAuth, AppleAuth, BiometricAuth uchun tatbiq qilinadi. AuthManager konteksti strategiyani DI yoki fabrika orqali qabul qiladi. Bu kirish ekranini o'zgartirmasdan yangi autentifikatsiya provayderlarini qo'shish imkonini beradi. Strategy naqshi ko'plab OAuth kutubxonalari va Firebase Authentication uchun asosdir.

Tez-tez beriladigan savollar

Qachon Strategy ni if-else o'rniga ishlatish kerak?

Strategy 3+ algoritm bo'lganda va ular o'zgarishi yoki kengayishi mumkin bo'lganda oqlanadi. Agar 2 ta algoritm bo'lsa va ular barqaror bo'lsa — oddiy if-else kamroq xarajat talab qiladi. Strategiyadan algoritmlar ilovaning turli qismlarida ishlatilganda, algoritmlarni ish vaqtida almashtirish kerak bo'lganda yoki har bir algoritm o'z bog'liqliklari va testlarini talab qilganda foydalaning.

Strategy va State bir xil narsami?

Yo'q, bular o'xshash tuzilishga ega turli naqshlardir. Strategy — mijoz algoritmni aniq tanlaydi va strategiyalar mustaqil. State — obyekt ichki holati o'zgarganda o'z xatti-harakatini o'zgartiradi va holatlar bir-biriga o'tishi mumkin. State da kontekst holat o'zgarishini boshqaradi, Strategy da — mijoz kodi.

Strategy ni sinflarsiz — closures orqali ishlatish mumkinmi?

Ha, Swift va Kotlin da strategiyani closure yoki lambda sifatida uzatish mumkin. Swift: typealias PaymentHandler = (Decimal) async throws -> PaymentResult. Kotlin: typealias PaymentFun = suspend (BigDecimal) -> PaymentResult. Bu oddiy holatlar uchun kodni soddalashtiradi, lekin nomlash va hujjatlashtirish yo'qoladi. 1-2 algoritm uchun closure yetarli, 4+ uchun — alohida sinflar yaxshiroq.

Strategy naqshini qanday test qilish kerak?

Har bir strategiya mock-bog'liqliklari bilan alohida unit test bilan test qilinadi. Kontekst mock-strategiya bilan test qilinadi — kontekst strategiya metodini chaqirishi va to'g'ri parametrlarni uzatishi tekshiriladi. Swift da XCTest + protokollar, Kotlin da MockK yoki Mockito dan foydalaning. Asosiy afzallik: har bir strategiya murakkab konfiguratsiyasiz izolyatsiya qilingan holda test qilinadi.

Strategy GoF naqshimi?

Ha, Strategy (Strategiya) — «Design Patterns: Elements of Reusable Object-Oriented Software» (Gamma, Helm, Johnson, Vlissides, 1994) kitobida tasvirlangan 23 naqshdan biridir. Xatti-harakat naqshlari guruhiga (Behavioral Patterns) kiradi. Sinonimlar: Policy (Siyosat). Smalltalk-80 dagi asl namunaviy kod GoF ning asl nashrida mavjud.

Xulosa

  • Strategy — umumiy interfeys bilan bir-birini almashtiruvchi algoritmlar uchun xatti-harakat naqshi
  • Inkapsulyatsiya — har bir algoritm alohida strategiya sinfida izolyatsiya qilingan
  • iOS Swift — Protocol, strukturalar va closures orqali tatbiq
  • Android Kotlin — Interface, lambdalar va Hilt bilan DI orqali tatbiq
  • Open/Closed printsipi — yangi strategiyalar kontekstni o'zgartirmasdan qo'shiladi
  • Qo'llanilishi — to'lovlar, tekshirish, saralash, autentifikatsiya, formatlash

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing