Adaptör Kalıbı
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 57 / 70.
Adapter deseni, uyumsuz arayüzlerin birlikte çalışmasını sağlayan yapısal bir desendir. İki sınıf arasında köprü görevi görerek bir sınıfın arayüzünü istemcilerin beklediği bir arayüze dönüştürür. Bunu, Avrupa tipi bir cihazı Amerikan tipi bir prize takmanızı sağlayan bir güç adaptörü gibi düşünebilirsiniz.
Bu desen, mevcut bir sınıfı kullanmak istediğinizde ancak sınıfın arayüzü kodunuzun ihtiyaç duyduğu şeyle eşleşmediğinde özellikle yararlıdır. Orijinal sınıfı değiştirmek yerine (ki bu sınıf üzerinde kontrolünüz olmayabilir), onu sarmalayan bir adaptör oluşturursunuz:
// Uyumsuz arayüze sahip mevcut sınıf
public class OldPrinter
{
public void PrintMessage(string msg) => Console.WriteLine($"Old: {msg}");
}
// Kodunuzun beklediği arayüz
public interface IPrinter
{
void Print(string text);
}
// Adaptör aradaki boşluğu doldurur
public class PrinterAdapter : IPrinter
{
private OldPrinter _oldPrinter;
public PrinterAdapter(OldPrinter oldPrinter)
{
_oldPrinter = oldPrinter;
}
public void Print(string text)
{
_oldPrinter.PrintMessage(text); // Eski arayüze delege eder
}
}Artık kodunuz, beklenen arayüz aracılığıyla eski yazıcıyla çalışabilir:
OldPrinter legacy = new OldPrinter();
IPrinter printer = new PrinterAdapter(legacy);
printer.Print("Hello"); // Eski: HelloAdapter kalıbı, üçüncü taraf kütüphaneleri veya eski kodu uygulamanıza entegre ederken paha biçilmezdir. İstemci kodu, perde arkasında işi gerçekte eski ve uyumsuz bir sınıfın yaptığından tamamen habersiz bir şekilde IPrinter arayüzüyle çalışır.
Görev
KolayAdapter desenini kullanarak bir medya oynatıcı sistemi oluşturalım. MP3 dosyalarını oynatan mevcut bir ses kitaplığınız var, ancak uygulamanızın farklı medya türlerini işleyebilen birleşik bir arayüze ihtiyacı var. Bu boşluğu kapatmak için bir adapter oluşturacak ve modern medya oynatıcınızın eski ses kitaplığıyla sorunsuz bir şekilde çalışmasını sağlayacaksınız.
Kodunuzu üç dosyaya ayıracaksınız:
LegacyAudio.cs: Bu, değiştiremeyeceğiniz mevcut bir kitaplığı temsil eder.LegacyAudioPlayerad alanında,MediaSystemmetoduna sahip vePlayMp3(string filename)dizesini döndüren bir"Playing MP3: {filename}"sınıfı oluşturun. Bu, uyumsuz arayüze sahip sınıf olan "adaptee"dir.MediaAdapter.cs: Arayüzü ve adapter'ı aynı ad alanında oluşturun. Dize döndürenIMediaPlayermetoduna sahip birPlay(string filename)arayüzü tanımlayın. ArdındanMediaPlayerAdapterarayüzünü uygulayan birIMediaPlayersınıfı oluşturun. Adapter'ınız birLegacyAudioPlayerörneğini (constructor aracılığıyla geçirilen) sarmalamalı vePlayçağrısını eski oynatıcınınPlayMp3metoduna çevirmelidir.Program.cs: Eski oynatıcıyı oluşturarak, onu adapter'ınızla sararak ve adapter'ıIMediaPlayerarayüzü üzerinden kullanarak her şeyi bir araya getirin. Bu, adapter arka planda eski sistemle iletişimi yönetirken istemci kodunun modern arayüzle nasıl çalışabileceğini gösterir.
Bir girdi alacaksınız:
- Oynatılacak dosyanın adı (ör.
song.mp3)
Bir LegacyAudioPlayer oluşturun, onu bir MediaPlayerAdapter ile sarın, ardından Play arayüzünü kullanarak adapter üzerinde IMediaPlayer metodunu çağırın ve sonucu yazdırın.
Örneğin, girdi favorite_track.mp3 ise çıktı şöyle olmalıdır:
Playing MP3: favorite_track.mp3Bu desenin güzelliği, ana kodunuzun yalnızca IMediaPlayer ile etkileşime girmesidir; asıl işi eski bir ses kitaplığının yaptığından haberi yoktur. Daha sonra farklı bir eski kitaplığı desteklemeniz gerekirse, istemci kodunda hiçbir değişiklik yapmadan yeni bir adapter oluşturmanız yeterli olur!
Kendin dene
using System;
using MediaSystem;
class Program
{
public static void Main(string[] args)
{
// Dosya adı girişini oku
string filename = Console.ReadLine();
// TODO: Bir LegacyAudioPlayer örneği oluşturun
// TODO: Bunu bir MediaPlayerAdapter içine sarın
// TODO: Adaptörü IMediaPlayer arayüzü üzerinden kullanın
// ve filename ile Play metodunu çağırmanın sonucunu yazdırın
}
}
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
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci KayıtlarıKendi başına pratik yap: Online C# derleyicisi