Komut Deseni
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 94 / 110.
Command kalıbı, bir isteği nesne olarak kapsüller ve istemcileri farklı isteklerle parametreleştirmenize, işlemleri kuyruğa almanıza veya geri alma işlevini desteklemenize olanak tanır. Bir yöntemi doğrudan çağırmak yerine, eylemi saklanabilen, aktarılabilen veya daha sonra yürütülebilen bir komut nesnesi içinde sararsınız.
Bu kalıp üç temel bileşen içerir: execute metoduna sahip bir Command arayüzü, belirli eylemleri uygulayan Concrete Commands ve asıl işi gerçekleştiren bir Receiver. İsteğe bağlı bir Invoker, ne yaptıklarını bilmeden komutları tetikler:
abstract class Command {
void execute();
}
class Light {
void turnOn() => print('Light is ON');
void turnOff() => print('Light is OFF');
}
class TurnOnCommand implements Command {
final Light light;
TurnOnCommand(this.light);
@override
void execute() => light.turnOn();
}
class TurnOffCommand implements Command {
final Light light;
TurnOffCommand(this.light);
@override
void execute() => light.turnOff();
}
class RemoteControl {
Command? _command;
void setCommand(Command command) {
_command = command;
}
void pressButton() {
_command?.execute();
}
}
void main() {
var light = Light();
var remote = RemoteControl();
remote.setCommand(TurnOnCommand(light));
remote.pressButton(); // Işık AÇIK
remote.setCommand(TurnOffCommand(light));
remote.pressButton(); // Işık KAPALI
}RemoteControl ışıklar hakkında hiçbir şey bilmez; yalnızca kendisine verilen komutu yürütür. Bu ayrıştırma, çağıranı değiştirmeden yeni komutlar eklemeyi kolaylaştırır. Command deseni, eylemleri birinci sınıf nesneler olarak ele almanız gereken geri alma/yineleme sistemlerini, görev kuyruklarını veya makro kaydını uygulamak için idealdir.
Görev
KolayCommand kalıbını kullanarak bir metin düzenleyici komut sistemi oluşturalım! Metin işlemlerini komut nesneleri olarak kapsülleyen ve bir düzenleyicinin her işlemin ayrıntılarını bilmeden farklı eylemleri gerçekleştirmesine olanak tanıyan bir sistem oluşturacaksın. Bu, Command kalıbının klasik bir kullanım alanıdır; bunu her eylemin bir nesne olarak saklandığı bir geri alma/yineleme sistemi gibi düşünebilirsin.
Kodunu iki dosyada düzenleyeceksin:
commands.dart: Komut sistemini burada oluştur.Commandmetodunu bildiren soyut birexecute()sınıfıyla başla. Ardından, birTextDocumentalanı (başlangıçta boş) tutan ve üç metodu bulunan birString contentsınıfı (alıcı) oluştur:append(String text)- metni içeriğin sonuna eklerclear()- içeriği boş bir dizeye ayarlarshow()-Document: [content]ifadesini yazdırır
TextDocumentile çalışan üç somut komut uygula:AppendCommand- oluşturucusunda bir belge ve metin alır, çalıştırıldığında metni eklerClearCommand- oluşturucusunda bir belge alır, çalıştırıldığında belgeyi temizlerShowCommand- oluşturucusunda bir belge alır, çalıştırıldığında içeriğini gösterir
TextEditorsınıfı (çağırıcı) oluştur. Komutları sıraya almak için biraddCommand(Command command)metodu ve sıraya alınan tüm komutları sırayla çalıştıran birrunAll()metodu bulunmalıdır.main.dart: Komut dosyanı içe aktar ve Command kalıbını göster. BirTextDocumentve birTextEditoroluştur. Aşağıdaki komutları sırayla sıraya al:Helloekle,Worldekle, belgeyi göster,!ekle, tekrar göster, belgeyi temizle ve son kez göster. Ardından sıraya alınan tüm komutları çalıştır.
TextEditor'ın ekleme, temizleme veya gösterme hakkında hiçbir şey bilmediğine dikkat et; yalnızca kendisine verilen komutları çalıştırır. Bu ayrıştırma, Command kalıbının özüdür!
Beklenen çıktı:
Document: Hello World
Document: Hello World!
Document: Kendin dene
import 'commands.dart';
void main() {
// TODO: Bir TextDocument örneği oluşturun
// TODO: Bir TextEditor örneği oluşturun
// TODO: Aşağıdaki komutları sırasıyla kuyruğa ekleyin:
// 1. "Hello" ekle
// 2. " World" ekle
// 3. Belgeyi göster
// 4. "!" ekle
// 5. Belgeyi tekrar göster
// 6. Belgeyi temizle
// 7. Belgeyi son bir kez göster
// TODO: Kuyruğa alınan tüm komutları çalıştı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
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