Adapter
Muammo: kodingiz bir interfeysga tayanadi, lekin qo’lda boshqacha metodli tayyor (yoki tashqi) tur bor. Uni o’zgartira olmaysiz - masalan, bu tashqi kutubxona.
G’oya: o’rtaga adapter qo’yasiz - u eski turni o’rab, sizga kerakli interfeysni implement qiladi va chaqiruvlarni ichkaridagi metodlarga yo’naltiradi.
adapter.go
package main
import "fmt"
// Bizning kodimiz shu interfeysga tayanadi.
type Notifier interface {
Notify(message string) error
}
// Eski, tashqi kutubxona - uni o'zgartira olmaymiz.
type LegacyEmailClient struct{}
func (LegacyEmailClient) SendEmail(subject, body string) {
fmt.Printf("EMAIL yuborildi | mavzu: %q | matn: %q\n", subject, body)
}
// EmailAdapter LegacyEmailClient ni Notifier ga moslashtiradi.
type EmailAdapter struct {
client LegacyEmailClient
}
func (a EmailAdapter) Notify(message string) error {
a.client.SendEmail("Bildirishnoma", message)
return nil
}
func Broadcast(n Notifier, msg string) {
if err := n.Notify(msg); err != nil {
fmt.Println("xato:", err)
}
}
func main() {
var n Notifier = EmailAdapter{client: LegacyEmailClient{}}
Broadcast(n, "Serverda yangilanish bor")
}$ go run adapter.go
EMAIL yuborildi | mavzu: "Bildirishnoma" | matn: "Serverda yangilanish bor"Broadcast faqat Notifier bilan ishlaydi; LegacyEmailClientning SendEmail metodini adapter yashiradi.
Qachon: mos kelmagan interfeyslarni ulash kerak bo’lganda - ayniqsa tashqi kod bilan. Go note: interfeys yashirin bo’lgani uchun adapter juda ixcham; ko’pincha io.Reader/io.Writer atrofida shu usul ishlatiladi.
Manba / batafsil: refactoring.guru/design-patterns/adapter
Last updated on