Menu
CoddyTech

Pola Adapter

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 92 dari 107.

Pola Adapter memungkinkan antarmuka yang tidak kompatibel untuk bekerja sama dengan membungkus tipe yang sudah ada menggunakan antarmuka baru. Command mengenkapsulasi tindakan, sedangkan Adapter menerjemahkan satu antarmuka ke antarmuka lain yang diharapkan client.

Bayangkan kamu memiliki printer lama yang menggunakan tanda tangan method berbeda dari yang diharapkan aplikasimu:

// Interface tujuan yang digunakan aplikasimu
type Printer interface {
    Print(text string) string
}

// Printer lama dengan interface yang tidak kompatibel
type OldPrinter struct{}

func (o OldPrinter) PrintDocument(doc string, copies int) string {
    return fmt.Sprintf("Old printer: %s (x%d)", doc, copies)
}

Adapter membungkus tipe lama dan mengimplementasikan antarmuka yang diharapkan:

type OldPrinterAdapter struct {
    oldPrinter OldPrinter
}

func (a OldPrinterAdapter) Print(text string) string {
    return a.oldPrinter.PrintDocument(text, 1)
}

Sekarang printer lama bekerja dengan lancar menggunakan kode yang mengharapkan antarmuka Printer:

func PrintMessage(p Printer, msg string) string {
    return p.Print(msg)
}

adapter := OldPrinterAdapter{oldPrinter: OldPrinter{}}
result := PrintMessage(adapter, "Hello")  // "Old printer: Hello (x1)"

Pola Adapter sangat berguna saat mengintegrasikan library pihak ketiga, bekerja dengan kode lama, atau saat kamu perlu menggunakan class yang sudah ada tetapi tidak sesuai dengan kebutuhan interface-mu. Pola ini berfungsi sebagai jembatan tanpa mengubah kode asli.

challenge icon

Tantangan

Mudah

Mari bangun sistem pemutar media menggunakan pola Adapter! Kamu memiliki pemutar audio modern yang mengharapkan antarmuka terpadu, tetapi kamu perlu mengintegrasikan peralatan audio lama yang menggunakan tanda tangan method yang sama sekali berbeda. Adapter-mu akan menjembatani kesenjangan ini, sehingga perangkat keras lama dapat bekerja dengan lancar bersama sistem baru.

Kamu akan mengatur kodemu dalam tiga file:

  • player.go: Definisikan antarmuka target dan perangkat audio lama.

    Buat antarmuka AudioPlayer yang diharapkan sistem modernmu, dengan method Play(track string) string yang menerima nama trek dan mengembalikan pesan pemutaran.

    Definisikan juga perangkat lama yang tidak sesuai dengan antarmuka ini:

    • struct VinylPlayer dengan field SpeedRPM (int). Struct ini memiliki method DropNeedle(record string, side string) string yang mengembalikan Playing [record] ([side] side) at [speed]rpm

    Antarmuka VinylPlayer tidak kompatibel dengan AudioPlayer. Antarmuka ini memerlukan dua parameter dan menggunakan nama method yang sama sekali berbeda.

  • adapter.go: Buat adapter yang membuat perangkat lama kompatibel.

    Buat struct VinylAdapter yang membungkus VinylPlayer dan menerapkan antarmuka AudioPlayer. Saat Play dipanggil, adapter harus memanggil method DropNeedle milik pemutar vinyl, dengan nilai default A untuk parameter sisi.

    Buat juga pemutar modern sebagai pembanding:

    • struct DigitalPlayer: method Play-nya mengembalikan Streaming: [track]
  • main.go: Tunjukkan kedua pemutar bekerja melalui antarmuka yang sama.

    Buat fungsi PlayMusic(player AudioPlayer, track string) string yang menggunakan antarmuka untuk memutar musik. Fungsi ini tidak perlu mengetahui atau memedulikan apakah yang digunakan adalah pemutar digital atau pemutar vinyl yang diadaptasi.

    Baca tipe pemutar (digital atau vinyl), lalu jika tipenya vinyl, baca juga kecepatan RPM. Setelah itu, baca nama trek. Buat pemutar yang sesuai (gunakan adapter untuk vinyl), putar trek melalui fungsi PlayMusic-mu, lalu cetak hasilnya.

Input berikut akan diberikan:

  • Baris 1: Tipe pemutar (digital atau vinyl)
  • Baris 2: Kecepatan RPM (hanya jika tipenya vinyl)
  • Baris terakhir: Nama trek yang akan diputar

Contohnya, jika diberikan:

digital
Bohemian Rhapsody

Output-mu seharusnya:

Streaming: Bohemian Rhapsody

Dan jika diberikan:

vinyl
33
Abbey Road

Output-mu seharusnya:

Playing Abbey Road (A side) at 33rpm

Dan jika diberikan:

vinyl
45
Blue Monday

Output-mu seharusnya:

Playing Blue Monday (A side) at 45rpm

Perhatikan bahwa fungsi PlayMusic bekerja dengan cara yang sama pada kedua pemutar. Fungsi ini sama sekali tidak mengetahui bahwa pemutar vinyl sebenarnya diadaptasi dari antarmuka yang sama sekali berbeda. Adapter menerjemahkan pemanggilan antarmuka modern ke format lama di balik layar!

Coba sendiri

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

// PlayMusic menggunakan interface AudioPlayer untuk memutar musik
// Fungsi ini bekerja dengan implementasi AudioPlayer apa pun
// TODO: Implementasikan fungsi ini untuk memanggil player.Play(track) dan mengembalikan hasilnya
func PlayMusic(player AudioPlayer, track string) string {
	// TODO: Implementasikan fungsi ini
	return ""
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	
	// Baca tipe pemutar
	playerType, _ := reader.ReadString('\n')
	playerType = strings.TrimSpace(playerType)
	
	var player AudioPlayer
	var track string
	
	if playerType == "vinyl" {
		// Baca kecepatan RPM untuk piringan hitam
		rpmStr, _ := reader.ReadString('\n')
		rpmStr = strings.TrimSpace(rpmStr)
		rpm, _ := strconv.Atoi(rpmStr)
		
		// Baca nama lagu
		track, _ = reader.ReadString('\n')
		track = strings.TrimSpace(track)
		
		// TODO: Buat VinylPlayer dengan RPM yang diberikan
		// TODO: Bungkus dengan VinylAdapter
		// TODO: Tetapkan ke variabel player
		_ = rpm // Hapus baris ini saat kamu menggunakan rpm
	} else {
		// Baca nama lagu
		track, _ = reader.ReadString('\n')
		track = strings.TrimSpace(track)
		
		// TODO: Buat DigitalPlayer
		// TODO: Tetapkan ke variabel player
	}
	
	// TODO: Panggil PlayMusic dan cetak hasilnya
	_ = player // Hapus baris ini saat kamu menggunakan player
	_ = track  // Hapus baris ini saat kamu menggunakan track
}
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