Menu
Coddy logo textTech

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.mp4

Temel 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.

challenge icon

Görev

Orta

Bu 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:

  1. interfaces.py dosyasında tanımlanan modern arayüzleri anlayın (bu dosya değiştirilemez)
  2. legacy_system.py dosyasındaki eski bileşenleri inceleyin (bu dosya değiştirilemez)
  3. Eski bileşenleri modern arayüzlerle uyumlu hâle getiren adaptör sınıflarını adapters.py dosyasında uygulayın
  4. Bu arayüzleri kullanan modern bir sistemi modern_system.py dosyası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())
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 Python derleyicisi