Menu
CoddyTech

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:

KategoriTujuanContoh
KreasiMekanisme pembuatan objectSingleton, Factory, Builder
StrukturalMenyusun tipe menjadi struktur yang lebih besarAdapter, Decorator, Composite
PerilakuKomunikasi antar-objectObserver, 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.

challenge icon

Tantangan

Mudah

Mari 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 Notifier dengan satu method Send(message string) string yang mengembalikan pesan konfirmasi.

    Buat implementasi dua tipe notifier konkret:

    • EmailNotifier dengan field Address. Method Send-nya mengembalikan Email to [address]: [message]
    • SMSNotifier dengan field PhoneNumber. Method Send-nya mengembalikan SMS to [phone]: [message]
  • dispatcher.go: Buat dispatcher yang dapat bekerja dengan notifier apa pun melalui interface.

    Buat struct NotificationDispatcher yang menyimpan slice interface Notifier. Tambahkan method berikut:

    • AddNotifier(n Notifier) untuk mendaftarkan notifier
    • Broadcast(message string) []string yang 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 (email atau sms) 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 (email atau sms), 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 midnight

Outputmu 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 midnight

Dan jika diberikan:

2
sms
555-9999
sms
555-0000
Meeting canceled

Outputmu seharusnya:

SMS to 555-9999: Meeting canceled
SMS to 555-0000: Meeting canceled

Struktur 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

}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Go online