Adaptör Kalıbı
Coddy'nin Python Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 50 / 64.
Adapter Kalıbı, uyumsuz arayüzlere sahip nesnelerin birlikte çalışmasını sağlar. İstemcilerin beklediği yeni bir arayüzle mevcut bir sınıfı sararak köprü görevi görür.
Uyumsuz arayüzlere sahip iki sistem burada verilmiştir:
class OldPrinter:
def old_print(self, text):
return f"OLD: {text}"
class NewPrinter:
def print(self, text):
return f"NEW: {text}"Eski yazıcı old_print() kullanırken yeni yazıcı print() kullanır.
Eski yazıcının yeni arayüzle çalışmasını sağlamak için bir adaptör oluşturun:
class PrinterAdapter:
def __init__(self, old_printer):
self.old_printer = old_printer
def print(self, text):
# Eski arayüzü yeni arayüze uyarla
return self.old_printer.old_print(text)Adaptör, eski yazıcıyı sarar ve beklenen arayüzü sağlar.
Aynı istemci koduyla her iki yazıcıyı da kullanın:
def print_document(printer, text):
return printer.print(text) # print() metodunu bekler
# Yeni yazıcıyı doğrudan kullan
new_printer = NewPrinter()
print(print_document(new_printer, "Hello"))
# Eski yazıcıyı adaptör aracılığıyla kullan
old_printer = OldPrinter()
adapter = PrinterAdapter(old_printer)
print(print_document(adapter, "Hello"))Medya oynatıcılarla başka bir örnek oluşturun:
class Mp3Player:
def play_mp3(self, filename):
return f"Playing MP3: {filename}"
class Mp4Player:
def play_mp4(self, filename):
return f"Playing MP4: {filename}"
class MediaAdapter:
def __init__(self, player, audio_type):
self.player = player
self.audio_type = audio_type
def play(self, filename):
if self.audio_type == "mp3":
return self.player.play_mp3(filename)
elif self.audio_type == "mp4":
return self.player.play_mp4(filename)class AudioPlayer:
def play(self, audio_type, filename):
if audio_type == "mp3":
return Mp3Player().play_mp3(filename)
else:
adapter = MediaAdapter(Mp4Player(), audio_type)
return adapter.play(filename)
player = AudioPlayer()
print(player.play("mp3", "song.mp3"))
print(player.play("mp4", "video.mp4"))Çıktı:
NEW: Hello
OLD: Hello
Playing MP3: song.mp3
Playing MP4: video.mp4Temel Nokta: Adapter Pattern, mevcut bir sınıfı yeni bir arayüzle sarmalayarak uyumsuz arayüzlerin birlikte çalışmasını sağlar. Adaptör, beklenen arayüzden gelen çağrıları, sarılmış nesnenin gerçek arayüzüne çevirir. Bu, mevcut kodu değiştirmeden eski kodu veya üçüncü taraf kütüphaneleri entegre etmek için kullanışlıdır.
Görev
OrtaBu görevde, eski sistemleri modern bir uygulama mimarisiyle bütünleştirmek için Adaptör tasarım desenini uygulayacaksınız. Adaptör deseni, bir arayüzü diğerine dönüştüren bir sarmalayıcı (adaptör) oluşturarak uyumsuz arayüzlere sahip nesnelerin birlikte çalışmasını sağlar.
Şirketinizin, yeni ve modern bir analiz platformuyla bütünleştirilmesi gereken eski bir veri analizi ve görselleştirme sistemi var. Eski bileşenlerin arayüzleri yeni sistemle uyumsuz. Eski kodu yeniden yazmak (bu, riskli ve maliyetli olabilir) yerine, bu bileşenlerin yeni sistemle çalışmasını sağlamak için adaptörler oluşturmanız istendi.
Şunları yapmanız gerekiyor:
interfaces.pydosyasında tanımlanan modern arayüzleri anlayın (bu dosya değiştirilemez)legacy_system.pydosyasındaki eski bileşenleri inceleyin (bu dosya değiştirilemez)- Eski bileşenleri modern arayüzlerle uyumlu hâle getiren adaptör sınıflarını
adapters.pydosyasında uygulayın - Bu arayüzleri kullanan modern bir sistemi
modern_system.pydosyasında oluşturun
Kendin dene
# Tüm gerekli sınıfları içe aktar
from adapters import LegacyDataAnalyzerAdapter, LegacyChartGeneratorAdapter
from modern_system import AnalyticsSystem
# Kapsamlı test durumu işleyicisi
test_case = input()
if test_case == "basic_adapter_test":
# Temel adaptör işlevselliğini test et
processor = LegacyDataAnalyzerAdapter()
data = [1, 2, 3, 4, 5]
processor.process_data(data)
results = processor.get_results()
print(f"Results: {results}")
elif test_case == "visualizer_adapter_test":
# Görselleştirici adaptörünü test et
visualizer = LegacyChartGeneratorAdapter("bar")
data = [10, 20, 30, 40, 50]
success = visualizer.visualize(data)
if success:
export_success = visualizer.export_visualization("test_chart.png")
print(f"Visualization exported: {export_success}")
elif test_case == "analytics_system_test":
# Tam analitik sistemini test et
processor = LegacyDataAnalyzerAdapter()
visualizer = LegacyChartGeneratorAdapter("line")
system = AnalyticsSystem(processor, visualizer)
data = [15, 25, 35, 45, 55]
result = system.analyze_and_visualize(data, "analytics_output.png")
print(f"System result: {result}")
elif test_case == "validation_error_test":
# Test validation errors
processor = LegacyDataAnalyzerAdapter()
try:
processor.process_data("invalid_data")
print("Validation failed - should have raised ValueError")
except ValueError as e:
print(f"Validation error caught: {e}")
elif test_case == "empty_data_test":
# Boş veriyle test et
processor = LegacyDataAnalyzerAdapter()
try:
processor.process_data([])
results = processor.get_results()
print(f"Empty data results: {results}")
except Exception as e:
print(f"Empty data error: {e}")
elif test_case == "chart_types_test":
# Farklı grafik türlerini test et
chart_types = ["bar", "line", "pie"]
data = [5, 15, 25, 35]
for chart_type in chart_types:
visualizer = LegacyChartGeneratorAdapter(chart_type)
success = visualizer.visualize(data)
print(f"{chart_type} chart created: {success}")
elif test_case == "file_extension_test":
# Dosya uzantısı işlemeyi test et
visualizer = LegacyChartGeneratorAdapter()
data = [1, 2, 3, 4]
visualizer.visualize(data)
# Çeşitli dosya adı formatlarını test et
filenames = ["test", "test.jpg", "test.pdf", "test.png"]
for filename in filenames:
success = visualizer.export_visualization(filename)
print(f"Export '{filename}': {success}")
elif test_case == "summary_test":
# Test analysis summary
processor = LegacyDataAnalyzerAdapter()
visualizer = LegacyChartGeneratorAdapter()
system = AnalyticsSystem(processor, visualizer)
data = [10, 20, 30, 40, 50, 60]
system.analyze_and_visualize(data)
summary = system.get_analysis_summary()
print("Analysis Summary:")
print(summary)
elif test_case == "mixed_data_test":
# Karışık sayısal veriyle test et
processor = LegacyDataAnalyzerAdapter()
data = [1.5, 2, 3.7, 4, 5.2]
processor.process_data(data)
results = processor.get_results()
print(f"Mixed data results: {results}")
elif test_case == "invalid_numeric_test":
# Geçersiz sayısal veriyle test et
processor = LegacyDataAnalyzerAdapter()
try:
processor.process_data([1, 2, "three", 4, 5])
print("Validation failed - should have raised ValueError")
except ValueError as e:
print(f"Invalid numeric data error: {e}")
elif test_case == "no_results_summary_test":
# Sonuç olmayan özeti test et
processor = LegacyDataAnalyzerAdapter()
visualizer = LegacyChartGeneratorAdapter()
system = AnalyticsSystem(processor, visualizer)
summary = system.get_analysis_summary()
print(f"No results summary: {summary}")
elif test_case == "large_dataset_test":
# Daha büyük veri kümesi ile test
processor = LegacyDataAnalyzerAdapter()
data = list(range(1, 101)) # 1'den 100'e
processor.process_data(data)
results = processor.get_results()
print(f"Large dataset - Mean: {results.get('mean', 'N/A'):.2f}")
print(f"Large dataset - Min: {results.get('min', 'N/A')}")
print(f"Large dataset - Max: {results.get('max', 'N/A')}")
elif test_case == "complete_workflow_test":
# Test complete workflow with multiple operations
processor = LegacyDataAnalyzerAdapter()
bar_visualizer = LegacyChartGeneratorAdapter("bar")
line_visualizer = LegacyChartGeneratorAdapter("line")
data = [12, 18, 25, 32, 28, 35, 42]
# Farklı görselleştiricilerle analitik sistemler oluştur
bar_system = AnalyticsSystem(processor, bar_visualizer)
line_system = AnalyticsSystem(LegacyDataAnalyzerAdapter(), line_visualizer)
# Analizleri çalıştır
bar_result = bar_system.analyze_and_visualize(data, "bar_chart.png")
line_result = line_system.analyze_and_visualize(data, "line_chart.png")
print("Complete workflow test completed")
print(f"Bar chart result: {bar_result['visualization_file']}")
print(f"Line chart result: {line_result['visualization_file']}")
# Özetleri al
print("Bar system summary:")
print(bar_system.get_analysis_summary())
print("Line system summary:")
print(line_system.get_analysis_summary())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 DosyalarOOP'ye GirişSınıflar ve Nesnelerself ParametresiMetotlarÖzniteliklerYapıcı Metot (__init__)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımsuper() FonksiyonuMetot Geçersiz KılmaÇoklu KalıtımMetot Çözümleme SırasıÖzet - Çalışan Hiyerarşisi7Özel Metotlar
Sihirli Metotlara GirişOperatör Aşırı YüklemeKapsayıcı Sihirli MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım kalıplarına girişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı13Final Meydan Okumaları
E-öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi5Çok Biçimlilik (Polymorphism)
Metot Geçersiz Kılmaya Yeniden BakışDuck TypingSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon ve KalıtımMixinsStatik ve Sınıf MetotlarıSınıf DekoratörleriBağlam Yöneticileri11Tasarı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ıKendi başına pratik yap: Online Python derleyicisi