Pengantar Pola Desain
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 85 dari 107.
Pola desain adalah solusi yang dapat digunakan kembali untuk masalah umum dalam desain perangkat lunak. Pola ini bukan kode yang kamu salin secara langsung, melainkan templat yang memandu cara kamu menyusun tipe dan interaksinya untuk menyelesaikan tantangan tertentu.
Pola desain biasanya dikelompokkan ke dalam tiga kategori:
| Kategori | Tujuan | Contoh |
|---|---|---|
| Kreasi | Mekanisme pembuatan object | Singleton, Factory, Builder |
| Struktural | Menyusun tipe menjadi struktur yang lebih besar | Adapter, Decorator, Composite |
| Perilaku | Komunikasi antar-object | Observer, Strategy, Command |
Di Go, pola desain terlihat berbeda dibandingkan dengan bahasa OOP tradisional.
Tanpa class atau inheritance, Go mengimplementasikan pola menggunakan interface, struct embedding, dan komposisi. Contohnya, saat Java mungkin menggunakan class abstrak, Go menggunakan interface. Saat C++ mungkin menggunakan inheritance, Go menggunakan embedding.
Mempelajari pola membantu kamu mengenali masalah umum dan mengomunikasikan solusi secara efektif kepada developer lain. Saat seseorang berkata "gunakan pola Strategy di sini", seluruh tim memahami pendekatannya tanpa penjelasan panjang.
Dalam beberapa pelajaran berikutnya, kamu akan menerapkan beberapa pola dasar di Go, dimulai dengan pola kreasi seperti Singleton dan Factory, lalu beralih ke pola perilaku seperti Observer dan Strategy.
Tantangan
MudahMari buat sistem notifikasi sederhana untuk menunjukkan bagaimana pola desain membantu menata kode! Kamu akan membuat struktur yang mudah diperluas dengan pola seperti Observer atau Strategy di pelajaran mendatang. Untuk saat ini, fokuslah membuat interface dan tipe yang rapi serta mengikuti prinsip OOP yang baik.
Kamu akan menata kodemu dalam tiga file:
notifier.go: Definisikan interface inti dan tipe untuk sistem notifikasimu.Buat interface
Notifierdengan satu methodSend(message string) stringyang mengembalikan pesan konfirmasi.Buat implementasi dua tipe notifier konkret:
EmailNotifierdengan fieldAddress. MethodSend-nya mengembalikanEmail to [address]: [message]SMSNotifierdengan fieldPhoneNumber. MethodSend-nya mengembalikanSMS to [phone]: [message]
dispatcher.go: Buat dispatcher yang dapat bekerja dengan notifier apa pun melalui interface.Buat struct
NotificationDispatcheryang menyimpan slice interfaceNotifier. Tambahkan method berikut:AddNotifier(n Notifier)untuk mendaftarkan notifierBroadcast(message string) []stringyang mengirim pesan melalui semua notifier terdaftar dan mengembalikan slice berisi semua string konfirmasi
Buat juga constructor
NewNotificationDispatcher()yang mengembalikan dispatcher yang sudah diinisialisasi.main.go: Siapkan notifier dan siarkan pesan.Baca jumlah notifier yang akan dibuat. Untuk setiap notifier, baca tipenya (
emailatausms) dan tujuannya (alamat atau nomor telepon). Tambahkan masing-masing ke dispatcher.Lalu baca pesan yang akan disiarkan. Kirim pesan melalui semua notifier dan cetak setiap konfirmasi pada baris tersendiri.
Input berikut akan diberikan:
- Baris 1: Jumlah notifier
- Untuk setiap notifier: tipe (
emailatausms), lalu tujuan - Baris terakhir: Pesan yang akan disiarkan
Contohnya, jika diberikan:
3
email
alice@example.com
sms
555-1234
email
bob@example.com
Server maintenance at midnightOutputmu seharusnya:
Email to alice@example.com: Server maintenance at midnight
SMS to 555-1234: Server maintenance at midnight
Email to bob@example.com: Server maintenance at midnightDan jika diberikan:
2
sms
555-9999
sms
555-0000
Meeting canceledOutputmu seharusnya:
SMS to 555-9999: Meeting canceled
SMS to 555-0000: Meeting canceledStruktur ini menunjukkan bagaimana interface memungkinkan desain yang fleksibel dan mudah diperluas. Dispatcher tidak mengetahui tipe notifier tertentu. Dispatcher hanya mengetahui bahwa notifier dapat menjalankan Send. Inilah dasar yang digunakan pola seperti Observer dan Strategy!
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Baca jumlah notifier
countStr, _ := reader.ReadString('\n')
count, _ := strconv.Atoi(strings.TrimSpace(countStr))
// Buat dispatcher baru
dispatcher := NewNotificationDispatcher()
// Baca setiap notifier dan tambahkan ke dispatcher
for i := 0; i < count; i++ {
notifierType, _ := reader.ReadString('\n')
notifierType = strings.TrimSpace(notifierType)
destination, _ := reader.ReadString('\n')
destination = strings.TrimSpace(destination)
// TODO: Buat notifier yang sesuai berdasarkan jenisnya
// dan tambahkan ke dispatcher
// Petunjuk: Periksa apakah notifierType adalah "email" atau "sms"
}
// Baca pesan yang akan disiarkan
message, _ := reader.ReadString('\n')
message = strings.TrimSpace(message)
// TODO: Siarkan pesan dan cetak setiap konfirmasi
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP di Go
File EksternalWorkspace Go dan modulePaket dan ImporNama yang Diekspor dan Tidak DieksporPengantar OOP di Gostruct sebagai classMendefinisikan method pada structPointer receiver vs value receiverInisialisasi structFungsi KonstruktorUlasan: Kalkulator Sederhana4Interface
Pengenalan InterfaceImplementasi ImplisitInterface sebagai KontrakInterface Kosong (any)Type AssertionType SwitchKomposisi InterfaceInterface Stringer & ErrorUlasan: Kalkulator Bentuk7Enkapsulasi
Field yang Diekspor vs Tidak DieksporEnkapsulasi Tingkat PackageMethod Getter dan SetterPenyembunyian Informasi di GoRingkasan: Data Siswa10Generics (Go 1.18+)
Pengantar GenericsParameter TipeBatasan TipeStruct GenerikCara Alternatif untuk Method GenerikRingkasan Koleksi Generik13Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola Abstract FactoryPola ObserverPola Strategy2Mendalami Tipe dan Struct
Tipe Dasar dan KompositDefinisi Tipe KustomTag StructStruct AnonimStruct BersarangNilai Nol dan Nilai BawaanRangkuman: Buku Kontak5Komposisi daripada Pewarisan
Mengapa Go Tidak Memiliki PewarisanDasar Penyematan StructPromosi methodMenyematkan Beberapa StructPenyematan vs AgregasiMembayangi method yang DisematkanRangkuman: Hierarki Karyawan8Penanganan Error & OOP
Interface errorTipe Error KustomPembungkusan Error (fmt.Errorf)Error Sentinelerrors.Is() dan errors.As()Panic, Defer, dan RecoverRangkuman: Parser File3Pointer dan Memori
Dasar-Dasar Pointer di GoPointer ke StructPass by Value vs ReferenceFungsi new()Garbage Collection di GoRekap: Pembuat Linked List6Polimorfisme di Go
Polimorfisme melalui InterfaceDuck Typing di GoAturan Pemenuhan InterfaceKoleksi PolimorfikInjeksi DependensiRangkuman: Pemroses Pembayaran9Konkruensi & OOP
Dasar-dasar GoroutineChannel & KomunikasiChannel Ber-buffer vs Tanpa BufferPernyataan selectsync.Mutex & sync.RWMutexsync.WaitGroupDesain Struct yang Aman untuk ThreadRingkasan: Worker PoolLatihan sendiri: Compiler Go online