Menu
Coddy logo textTech

Durum Deseni

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.

Bu desen, mevcut duruma bir başvuru tutan bir Bağlam ve her olası durum için davranışı tanımlayan Durum sınıflarından oluşur. Bağlamın 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.

challenge icon

Görev

Kolay

State kalıbını kullanarak bir trafik ışığı sistemi oluşturalım! Farklı durumlar arasında geçiş yapan bir trafik ışığı oluşturacaksın; her durum, ışığın rengini ve bir sonraki duruma nasıl geçeceğini belirler.

Kodunu iki dosyada düzenleyeceksin:

  • traffic_light.dart: Bu dosya, durum sınıflarını ve trafik ışığı bağlamını içerir. İki yönteme sahip soyut bir TrafficLightState sınıfı oluştur: mevcut ışık rengini döndüren String getColor() ve ışığı bir sonraki durumuna geçiren void next(TrafficLight light). Üç somut durum sınıfı uygula:
    • RedState - rengi olarak RED döndürür ve Stop! Light is red. çağrıldığında next() yazdırır, ardından GreenState durumuna geçer
    • GreenState - rengi olarak GREEN döndürür ve Go! Light is green. çağrıldığında next() yazdırır, ardından YellowState durumuna geçer
    • YellowState - rengi olarak YELLOW döndürür ve Caution! Light is yellow. çağrıldığında next() yazdırır, ardından RedState durumuna geçer
    Ardından, TrafficLight durumunda başlayan bir RedState sınıfı (bağlam) oluştur. Mevcut durumu değiştirmek için bir setState() yöntemi, mevcut duruma devrederek çalışan bir getColor() yöntemi ve mevcut durum üzerinde change() çağıran bir next() yöntemi olmalıdır.
  • main.dart: Trafik ışığı dosyanı içe aktar ve State kalıbının çalışmasını göster. Bir TrafficLight oluştur ve başlangıç rengini yazdır. Ardından change() yöntemini üç kez çağırarak her değişiklikten sonra rengi yazdır. Bu, ışığın tüm durumlar arasında geçiş yaparak başlangıca dönmesini gösterecektir.

TrafficLight sınıfının davranışı belirlemek için herhangi bir koşul ifadesine ihtiyaç duymadığına dikkat et - her durum kendi rengini ve sıradaki durumun hangisi olduğunu bilir. Trafik ışığı, yalnızca o anda etkin olan duruma yetki verir!

Beklenen çıktı:

RED
Stop! Light is red.
GREEN
Go! Light is green.
YELLOW
Caution! Light is yellow.
RED

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
}
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 Dart derleyicisi