Menu
Coddy logo textTech

Adaptör Kalıbı

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 92 / 107.

Adapter deseni, mevcut bir türü yeni bir arayüzle sararak uyumsuz arayüzlerin birlikte çalışmasını sağlar. Command eylemleri kapsüllerken Adapter, bir arayüzü istemcilerin beklediği başka bir arayüze dönüştürür.

Uygulamanızın beklediğinden farklı bir yöntem imzası kullanan eski bir yazıcınız olduğunu düşünün:

// Uygulamanızın kullandığı hedef arayüz
type Printer interface {
    Print(text string) string
}

// Uyumsuz arayüze sahip eski yazıcı
type OldPrinter struct{}

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

Adaptör, eski türü sarar ve beklenen arayüzü uygular:

type OldPrinterAdapter struct {
    oldPrinter OldPrinter
}

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

Artık eski yazıcı, Printer arayüzünü bekleyen kodla sorunsuz bir şekilde çalışıyor:

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

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

Adapter kalıbı, üçüncü taraf kitaplıkları entegre ederken, eski kodla çalışırken veya arayüz gereksinimlerinizle eşleşmeyen mevcut sınıfları kullanmanız gerektiğinde paha biçilmezdir. Özgün kodu değiştirmeden bir köprü görevi görür.

challenge icon

Görev

Kolay

Adapter desenini kullanarak bir medya oynatıcı sistemi oluşturalım! Birleşik bir arayüz bekleyen modern bir ses oynatıcınız var, ancak tamamen farklı yöntem imzaları kullanan eski ses ekipmanlarını entegre etmeniz gerekiyor. Adaptörünüz bu boşluğu kapatarak eski donanımın yeni sistemle sorunsuz şekilde çalışmasını sağlayacak.

Kodunuzu üç dosyaya ayıracaksınız:

  • player.go: Hedef arayüzünüzü ve eski bir ses cihazını tanımlayın.

    Modern sisteminizin beklediği bir AudioPlayer arayüzü oluşturun. Bu arayüzde, parça adını alan ve bir oynatma mesajı döndüren Play(track string) string yöntemi bulunmalıdır.

    Ayrıca bu arayüzle eşleşmeyen eski bir cihaz tanımlayın:

    • VinylPlayer yapısı, bir SpeedRPM alanına (int) sahiptir. DropNeedle(record string, side string) string döndüren Playing [record] ([side] side) at [speed]rpm yöntemine sahiptir.

    VinylPlayer'ın arayüzü AudioPlayer ile uyumlu değildir. İki parametre gerektirir ve tamamen farklı bir yöntem adı kullanır.

  • adapter.go: Eski cihazı uyumlu hâle getiren adaptörünüzü oluşturun.

    Bir VinylAdapter saran ve VinylPlayer arayüzünü uygulayan AudioPlayer yapısını oluşturun. Play çağrıldığında adaptör, yan parametresi için varsayılan olarak DropNeedle değerini kullanarak vinyl oynatıcının A yöntemini çağırmalıdır.

    Karşılaştırma için modern bir oynatıcı da oluşturun:

    • DigitalPlayer yapısı: Play yöntemi Streaming: [track] döndürür
  • main.go: Her iki oynatıcının da aynı arayüz üzerinden çalıştığını gösterin.

    Müzik çalmak için arayüzü kullanan PlayMusic(player AudioPlayer, track string) string adlı bir işlev oluşturun. Bu işlevin dijital bir oynatıcı mı yoksa adaptörle uyarlanmış bir vinyl oynatıcı mı kullandığını bilmesine veya önemsemesine gerek olmamalıdır.

    Bir oynatıcı türü (digital veya vinyl) okuyun; vinyl ise RPM hızını da okuyun. Ardından parça adını okuyun. Uygun oynatıcıyı oluşturun (vinyl için adaptörü kullanarak), parçayı PlayMusic işleviniz aracılığıyla çalın ve sonucu yazdırın.

Aşağıdaki girdiler sağlanacaktır:

  • 1. satır: Oynatıcı türü (digital veya vinyl)
  • 2. satır: RPM hızı (yalnızca vinyl ise)
  • Son satır: Çalınacak parçanın adı

Örneğin, şu girdi verildiğinde:

digital
Bohemian Rhapsody

Çıktınız şu olmalıdır:

Streaming: Bohemian Rhapsody

Ve şu girdi verildiğinde:

vinyl
33
Abbey Road

Çıktınız şu olmalıdır:

Playing Abbey Road (A side) at 33rpm

Ve şu girdi verildiğinde:

vinyl
45
Blue Monday

Çıktınız şu olmalıdır:

Playing Blue Monday (A side) at 45rpm

PlayMusic işlevinin her iki oynatıcıyla da aynı şekilde çalıştığına dikkat edin. Vinyl oynatıcının aslında tamamen farklı bir arayüzden uyarlandığı hakkında hiçbir bilgisi yoktur. Adaptör, modern arayüz çağrılarını perde arkasında eski biçime dönüştürür!

Kendin dene

package main

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

// PlayMusic, müzik çalmak için AudioPlayer arayüzünü kullanır
// Bu fonksiyon herhangi bir AudioPlayer uygulamasıyla çalışır
// TODO: Bu fonksiyonu player.Play(track) çağıracak ve sonucu döndürecek şekilde uygula
func PlayMusic(player AudioPlayer, track string) string {
	// TODO: Bu fonksiyonu uygula
	return ""
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	
	// Oynatıcı türünü oku
	playerType, _ := reader.ReadString('\n')
	playerType = strings.TrimSpace(playerType)
	
	var player AudioPlayer
	var track string
	
	if playerType == "vinyl" {
		// Vinil için RPM hızını oku
		rpmStr, _ := reader.ReadString('\n')
		rpmStr = strings.TrimSpace(rpmStr)
		rpm, _ := strconv.Atoi(rpmStr)
		
		// Parça adını oku
		track, _ = reader.ReadString('\n')
		track = strings.TrimSpace(track)
		
		// TODO: Verilen RPM ile bir VinylPlayer oluştur
		// TODO: Onu bir VinylAdapter içine sar
		// TODO: player değişkenine ata
		_ = rpm // rpm kullandığınızda bu satırı kaldırın
	} else {
		// Parça adını oku
		track, _ = reader.ReadString('\n')
		track = strings.TrimSpace(track)
		
		// TODO: Bir DigitalPlayer oluştur
		// TODO: player değişkenine ata
	}
	
	// TODO: PlayMusic'i çağır ve sonucu yazdır
	_ = player // player'ı kullandığında bu satırı kaldır
	_ = track  // track'i kullandığında bu satırı kaldır
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Go derleyicisi