Şablon Metot Deseni
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 97 / 110.
Şablon Yöntemi deseni, bir algoritmanın iskeletini temel sınıfta tanımlar ve alt sınıfların genel yapıyı değiştirmeden belirli adımları geçersiz kılmasına olanak tanır. Temel sınıf iş akışını kontrol ederken alt sınıflar ayrı ayrı adımları özelleştirir.
Bu kalıp kalıtımı kullanır: soyut bir sınıf, bir dizi adımı çağıran bir şablon yöntemi tanımlar; bu adımların bazıları soyuttur (alt sınıflar tarafından uygulanmalıdır), bazıları ise varsayılan uygulamalara sahiptir:
abstract class DataProcessor {
// Şablon metot - algoritma yapısını tanımlar
void process() {
readData();
processData();
saveData();
}
void readData(); // Soyut - alt sınıflar uygulamalıdır
void processData(); // Soyut - alt sınıflar uygulamalıdır
void saveData() { // Varsayılan uygulama
print('Data saved to database');
}
}
class CsvProcessor extends DataProcessor {
@override
void readData() => print('Reading CSV file');
@override
void processData() => print('Parsing CSV rows');
}
class JsonProcessor extends DataProcessor {
@override
void readData() => print('Reading JSON file');
@override
void processData() => print('Parsing JSON objects');
@override
void saveData() => print('Saved to cloud storage');
}
void main() {
var csv = CsvProcessor();
csv.process();
// CSV dosyası okunuyor
// CSV satırları ayrıştırılıyor
// Veri veritabanına kaydedildi
var json = JsonProcessor();
json.process();
// JSON dosyası okunuyor
// JSON nesneleri ayrıştırılıyor
// Bulut depolamaya kaydedildi
}process() yöntemi şablondur - işlemlerin sırasını tanımlar. Alt sınıflar readData() ve processData() yöntemlerini farklı şekilde uygular ve isteğe bağlı olarak saveData() yöntemini geçersiz kılabilir. Temel avantaj, algoritmanın yapısının tüm uygulamalarda tutarlı kalırken tek tek adımlarda esneklik sağlamasıdır.
Görev
KolayŞablon Method desenini kullanarak bir rapor oluşturma sistemi geliştirelim! Farklı rapor türlerinin aynı genel yapıyı izlediği, ancak her rapor türünün veri toplama ve çıktıyı biçimlendirme gibi belirli adımları özelleştirdiği bir çerçeve oluşturacaksınız.
Kodunuzu iki dosyaya ayıracaksınız:
report_generator.dart: Bu dosya, soyut temel sınıfınızı ve somut rapor uygulamalarınızı içerir. Rapor oluşturma iş akışını şu sırayla tanımlayanReportGeneratoradlı bir şablon metoduna sahip soyut birgenerate()sınıfı oluşturun:fetchData(),analyzeData(),formatReport()vedeliver().fetchData()veformatReport()metotları soyut olmalıdır (her rapor türü bunları farklı şekilde ele alır);analyzeData()metoduAnalyzing data...yazdırmalı vedeliver()metodu varsayılan uygulamalar olarakReport delivered via email.yazdırmalıdır. Ardından iki somut rapor sınıfı oluşturun:SalesReport-fetchData()metoduFetching sales data from database...yazdırmalı veformatReport()metoduFormatting as bar charts and tables.yazdırmalıdır.InventoryReport-fetchData()metoduFetching inventory levels from warehouse...yazdırmalı,formatReport()metoduFormatting as inventory list.yazdırmalı vedeliver()metodunu geçersiz kılarakReport sent to warehouse manager.yazdırmalıdır.
main.dart: Rapor oluşturucu dosyanızı içe aktarın ve Şablon Method deseninin özelleştirmeye izin verirken algoritma yapısını nasıl tutarlı kıldığını gösterin. BirSalesReportoluşturun vegenerate()metodunu çağırın. Ardından ayırıcı olarak boş bir satır yazdırın. BirInventoryReportoluşturun ve onungenerate()metodunu da çağırın.
Her iki raporun da aynı dört adımlı süreci izlediğine, ancak her birinin kendi amacına özgü önemli adımları özelleştirdiğine dikkat edin. InventoryReport ayrıca varsayılan teslim yöntemini geçersiz kılarak raporları farklı bir alıcıya gönderir!
Beklenen çıktı:
Fetching sales data from database...
Analyzing data...
Formatting as bar charts and tables.
Report delivered via email.
Fetching inventory levels from warehouse...
Analyzing data...
Formatting as inventory list.
Report sent to warehouse manager.Kendin dene
import 'report_generator.dart';
void main() {
// TODO: Bir SalesReport oluştur ve generate() metodunu çağır
// TODO: Ayırma için boş bir satır yazdır
// TODO: Bir InventoryReport oluştur ve generate() metodunu çağır
}
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
1Nesne Tabanlı Programlamanın Temelleri
Harici DosyalarKütüphaneler ve İçe AktarmalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar SözcüğüMetotlarÖrnek DeğişkenleriYapıcıların TemelleriTekrar - Basit Hesap Makinesi4Null Güvenliği
Null Güvenliğine GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Sözcüğü ve Null GüvenliğiNull-Aware OperatörlerSınıflarda Null GüvenliğiTekrar - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulamak ve GenişletmekBirden Çok ArayüzTekrar - Şekil Hesaplayıcı10Koleksiyonlar ve Generics
List, Set, Map Genel BakışTür Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorTekrar - Generic Depolama2Dart'ta Yapıcılar
Varsayılan YapıcıAdlandırılmış YapıcılarBaşlatıcı ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Ön Ek KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DerinliğiBilgi GizlemeTekrar - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Çok Mixin KullanımıMixin'lerde on Anahtar SözcüğüMixin ve Kalıtım KarşılaştırmasıMixin ve Arayüz KarşılaştırmasıÖzet - Hayvan Sistemi11Özel Metotlar
toString() Geçersiz KılmahashCode & == Geçersiz KılmaComparable Arayüzücall() MetodunoSuchMethod Geçersiz KılmaÖzet - Özel Koleksiyon14Tasarım Desenleri Bölüm 1
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy Deseni3Sınıf Özellikleri
Örnek ve Static ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatic Metotlar ve AlanlarGetter ve Setter'larÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar SözcüğüMetot Geçersiz Kılma@override Açıklamasıfinal Sınıf Anahtar SözcüğüKurucular ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriArayüzler Yoluyla Çok BiçimlilikÇalışma Zamanı Tür Denetimiis ve as OperatörleriCovariant Anahtar KelimesiTekrar - Ödeme İşlemcisi12Asenkron OOP
Future'ler ve async/awaitStream TemelleriStream DenetleyicileriAsenkron YapıcılarSınıf Metotlarında AsenkronlukÖzet - Veri Getirici15Tasarım Desenleri Bölüm 2
Komut DeseniAdaptör DeseniDekoratör DeseniŞablon Metot DeseniDurum DeseniBileşik DesenDepo DeseniKendi başına pratik yap: Online Dart derleyicisi