Durum Kalıbı
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 98 / 110.
State deseni, bir nesnenin iç durumu değiştiğinde davranışını değiştirmesine olanak tanıyarak nesnenin sınıfı değişmiş gibi görünmesini sağlar. Farklı durumları yönetmek için karmaşık koşullu ifadeler kullanmak yerine, her durumu kendi sınıfında kapsüller ve davranışı mevcut durum nesnesine devredersiniz.
Desen, mevcut duruma bir referans tutan bir Context ve her olası durum için davranışı tanımlayan State sınıflarından oluşur. Context'in durumu değiştiğinde, davranışı otomatik olarak değişir:
abstract class DocumentState {
void publish(Document doc);
String getStatus();
}
class DraftState implements DocumentState {
@override
void publish(Document doc) {
print('Moving to review...');
doc.setState(ReviewState());
}
@override
String getStatus() => 'Draft';
}
class ReviewState implements DocumentState {
@override
void publish(Document doc) {
print('Document published!');
doc.setState(PublishedState());
}
@override
String getStatus() => 'Under Review';
}
class PublishedState implements DocumentState {
@override
void publish(Document doc) {
print('Already published.');
}
@override
String getStatus() => 'Published';
}
class Document {
DocumentState _state = DraftState();
void setState(DocumentState state) => _state = state;
void publish() => _state.publish(this);
String getStatus() => _state.getStatus();
}
void main() {
var doc = Document();
print(doc.getStatus()); // Taslak
doc.publish(); // İncelemeye taşınıyor...
print(doc.getStatus()); // İnceleme Altında
doc.publish(); // Belge yayınlandı!
print(doc.getStatus()); // Yayınlandı
}Her durum sınıfı publish() eylemini farklı şekilde işler ve belgeyi bir sonraki duruma geçirebilir. Document sınıfı, mevcut durumunu kontrol etmek için koşullu ifadelere ihtiyaç duymaz; sadece o anda hangi durum nesnesi aktifse ona yetki devreder. Bu desen; sipariş işleme, medya oynatıcılar veya iş akışı sistemleri gibi belirgin davranış modlarına sahip nesneler için idealdir.
Görev
KolayState desenini kullanarak bir trafik ışığı sistemi oluşturalım! Her bir durumun ışığın rengini ve bir sonraki duruma nasıl geçeceğini belirlediği, farklı durumlar arasında döngü yapan bir trafik ışığı oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
traffic_light.dart: Bu dosya, durum sınıflarınızı ve trafik ışığı bağlamını (context) içerir. İki yöntemi olan birTrafficLightStatesoyut sınıfı oluşturun: mevcut ışık rengini döndürenString getColor()ve ışığı bir sonraki durumuna geçirenvoid next(TrafficLight light). Üç somut durum sınıfı uygulayın:RedState- renk olarakREDdöndürür venext()çağrıldığındaStop! Light is red.yazdırır, ardındanGreenStatedurumuna geçer.GreenState- renk olarakGREENdöndürür venext()çağrıldığındaGo! Light is green.yazdırır, ardındanYellowStatedurumuna geçer.YellowState- renk olarakYELLOWdöndürür venext()çağrıldığındaCaution! Light is yellow.yazdırır, ardındanRedStatedurumuna geçer.
RedStateile başlayan birTrafficLightsınıfı (bağlam) oluşturun. Mevcut durumu değiştirmek için birsetState()yöntemine, mevcut duruma yetki veren birgetColor()yöntemine ve mevcut durum üzerindenext()yöntemini çağıran birchange()yöntemine sahip olmalıdır.main.dart: Trafik ışığı dosyanızı içe aktarın ve State desenini iş başında gösterin. BirTrafficLightoluşturun ve başlangıç rengini yazdırın. Ardındanchange()yöntemini üç kez çağırın ve her değişiklikten sonra rengi yazdırın. Bu, ışığın tüm durumlar arasında döngü yaparak başlangıca döndüğünü gösterecektir.
TrafficLight sınıfının davranışı belirlemek için herhangi bir koşullu ifadeye (if/else) ihtiyaç duymadığına dikkat edin; her durum kendi rengini ve hangi durumun sırada olduğunu bilir. Trafik ışığı sadece o an aktif olan duruma yetki verir!
Beklenen çıktı:
RED
Stop! Light is red.
GREEN
Go! Light is green.
YELLOW
Caution! Light is yellow.
REDKopya kağıdı
State deseni, bir nesnenin iç durumu değiştiğinde davranışını değiştirmesine olanak tanır. Karmaşık koşullu ifadeler kullanmak yerine, her durum kendi sınıfı içinde kapsüllenir.
Desen şunlardan oluşur:
- Context: Mevcut duruma bir referans tutar
- State sınıfları: Olası her durum için davranışı tanımlar
Temel yapı:
abstract class DocumentState {
void publish(Document doc);
String getStatus();
}
class DraftState implements DocumentState {
@override
void publish(Document doc) {
print('Moving to review...');
doc.setState(ReviewState());
}
@override
String getStatus() => 'Draft';
}
class Document {
DocumentState _state = DraftState();
void setState(DocumentState state) => _state = state;
void publish() => _state.publish(this);
String getStatus() => _state.getStatus();
}Bağlam (context), davranışı mevcut durum nesnesine devreder. Her durum sınıfı eylemleri farklı şekilde ele alır ve bir sonraki duruma geçiş yapabilir. Bu, mevcut durumu kontrol etmek için koşullu ifadelere olan ihtiyacı ortadan kaldırır.
Sipariş işleme, medya oynatıcılar veya iş akışı sistemleri gibi belirgin davranış modlarına sahip nesneler için idealdir.
Kendin dene
import 'traffic_light.dart';
void main() {
// TODO: Bir TrafficLight örneği oluşturun
// TODO: Başlangıç rengini yazdırın
// TODO: change() fonksiyonunu çağırın ve rengi yazdırın (tüm durumlar arasında geçiş yapmak için 3 kez)
// İlk değişim: RED -> GREEN
// İkinci değişim: GREEN -> YELLOW
// Üçüncü değişim: YELLOW -> RED
}
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 DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarı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ı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarı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ıRepository Kalıbı