โ Kembali ke Design Pattern
โ๏ธ
Behavioral
Strategy
Mendefinisikan sekumpulan algoritma yang bisa saling dipertukarkan dan memungkinkan penggantiannya saat runtime.
Masalahnya
Sebuah class punya beberapa varian algoritma yang dipilih lewat if/else atau switch yang besar. Menambah varian baru berarti harus mengubah class itu sendiri.
Cara Kerja
- โบSetiap algoritma dibungkus di balik interface yang sama
- โบAlgoritma bisa diganti saat runtime tanpa mengubah class context
- โบMenghilangkan blok kondisional besar untuk memilih algoritma
- โบContext mendelegasikan pekerjaan ke strategy dan tidak menjalankan algoritmanya sendiri
- โบSangat dekat dengan dependency injection: strategy di-inject dari luar
Kapan Digunakan
โBeberapa algoritma terkait yang hanya berbeda dalam perilakunya
โPerilaku yang bisa ditukar: sorting, kompresi, pembayaran, validasi
โMengganti rantai if/else panjang yang memilih algoritma
โSaat kamu ingin pengguna bisa mengonfigurasi atau memperluas perilaku
Contoh di Dunia Nyata
๐
iOS
JSONEncoder.dateEncodingStrategy, URLSessionConfiguration, UICollectionViewLayout
๐ค
Android
RecyclerView.LayoutManager (Linear/Grid/Staggered), Room TypeConverter
๐
Web
Passport.js strategies (local, OAuth), webpack's loader config, sorting comparators
Contoh Kode
Swift
protocol ValidationStrategy {
func validate(_ input: String) -> Bool
}
struct EmailValidator: ValidationStrategy {
func validate(_ input: String) -> Bool {
input.contains("@") && input.contains(".")
}
}
struct PhoneValidator: ValidationStrategy {
func validate(_ input: String) -> Bool {
input.allSatisfy { $0.isNumber } && input.count >= 10
}
}
struct MinLengthValidator: ValidationStrategy {
let minLength: Int
func validate(_ input: String) -> Bool { input.count >= minLength }
}
class InputField {
var strategy: ValidationStrategy
init(strategy: ValidationStrategy) { self.strategy = strategy }
func isValid(_ input: String) -> Bool { strategy.validate(input) }
}
let emailField = InputField(strategy: EmailValidator())
print(emailField.isValid("agus@example.com")) // true
print(emailField.isValid("not-an-email")) // false
emailField.strategy = MinLengthValidator(minLength: 6)
print(emailField.isValid("hello")) // false