Menu
Coddy logo textTech

Observer Deseni

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 92 / 110.

Observer deseni, nesneler arasında bire-çok ilişkisi kurar: bir nesne (konu) durumunu değiştirdiğinde, ona bağlı tüm nesneler (gözlemciler) otomatik olarak bilgilendirilir. Bu; kullanıcı arayüzü güncellemeleri, olay sistemleri veya uygulamanızın birden fazla bölümünün değişikliklere tepki vermesi gereken her durum gibi senaryolar için idealdir.

Bu örüntü iki temel rol içerir: gözlemcilerin bir listesini tutan ve değişikliklerden onları haberdar eden bir Subject ile kendilerini kaydeden ve güncellemelere yanıt veren Observers:

abstract class Observer {
  void update(String message);
}

class NewsAgency {
  final List<Observer> _observers = [];
  String _latestNews = '';

  void subscribe(Observer observer) {
    _observers.add(observer);
  }

  void unsubscribe(Observer observer) {
    _observers.remove(observer);
  }

  void publishNews(String news) {
    _latestNews = news;
    for (var observer in _observers) {
      observer.update(_latestNews);
    }
  }
}

class NewsChannel implements Observer {
  final String name;
  NewsChannel(this.name);

  @override
  void update(String message) {
    print('$name received: $message');
  }
}

void main() {
  var agency = NewsAgency();
  var cnn = NewsChannel('CNN');
  var bbc = NewsChannel('BBC');

  agency.subscribe(cnn);
  agency.subscribe(bbc);

  agency.publishNews('Breaking news!');
  // CNN received: Breaking news!
  // BBC received: Breaking news!
}

publishNews çağrıldığında ajans, abone olmuş tüm gözlemciler üzerinde yineleme yapar ve onların update yöntemini çağırır. Gözlemciler istedikleri zaman abone olabilir veya abonelikten çıkabilir; bu da sistemi esnek ve gevşek bağlı hâle getirir — öznenin gözlemcilerinin belirli türlerini bilmesine gerek yoktur.

challenge icon

Görev

Kolay

Observer kalıbını kullanarak bir hisse senedi fiyatı uyarı sistemi oluşturalım! Bir hisse senedi göstergesinin, fiyat değiştiğinde birden fazla yatırımcıyı bilgilendirdiği ve her yatırımcının piyasa güncellemelerine kendi yöntemiyle tepki verebildiği bir sistem oluşturacaksın.

Kodunu iki dosyaya ayıracaksın:

  • stock_system.dart: Gözlemci sistemini burada oluştur:
    • Investor adlı, void onPriceChange(String stockName, double price) metoduna sahip soyut bir sınıf
    • DayTrader arayüzünü uygulayan Investor adlı bir sınıf. Bir name alanına sahiptir ve onPriceChange metodu şunu yazdırır: [name] sees [stockName] at $[price] - Making quick trade!
    • LongTermInvestor arayüzünü uygulayan Investor adlı bir sınıf. Bir name alanına sahiptir ve onPriceChange metodu şunu yazdırır: [name] notes [stockName] at $[price] - Holding steady.
    • Şunlara sahip bir StockTicker sınıfı (özne):
      • Bir String stockName alanı
      • Abone olan yatırımcıları depolamak için özel bir liste
      • Bir yatırımcı eklemek için subscribe(Investor investor) metodu
      • Bir yatırımcıyı kaldırmak için unsubscribe(Investor investor) metodu
      • Tüm abone olan yatırımcıları yeni fiyattan haberdar eden bir updatePrice(double newPrice) metodu
  • main.dart: Hisse senedi sistemini içe aktar ve Observer kalıbını çalışırken göster:
    • StockTicker adlı bir hisse senedi için bir DART oluştur
    • DayTrader adlı bir Alice ve LongTermInvestor adlı bir Bob oluştur
    • Her iki yatırımcıyı da göstergeye abone et
    • Fiyatı 150.50 olarak güncelle (her iki yatırımcı da bilgilendirilmelidir)
    • Boş bir satır yazdır
    • Alice'in gösterge aboneliğini iptal et
    • Fiyatı 155.75 olarak güncelle (artık yalnızca Bob bilgilendirilmelidir)

Bu, Observer kalıbının gevşek bağlı bir sistem oluşturmayı nasıl sağladığını gösterir - StockTicker, günlük alım satım yapan yatırımcıları mı yoksa uzun vadeli yatırımcıları mı bilgilendirdiğini bilmek zorunda değildir; yalnızca abone olan herkes üzerinde onPriceChange metodunu çağırır!

Beklenen çıktı:

Alice sees DART at $150.5 - Making quick trade!
Bob notes DART at $150.5 - Holding steady.

Bob notes DART at $155.75 - Holding steady.

Kendin dene

import 'stock_system.dart';

void main() {
  // TODO: 'DART' adında bir hisse senedi için bir StockTicker oluşturun
  
  // TODO: 'Alice' adında bir DayTrader oluşturun
  
  // TODO: 'Bob' adında bir LongTermInvestor oluşturun
  
  // TODO: Her iki yatırımcıyı da ticker'a abone yapın
  
  // TODO: Fiyatı 150.50 olarak güncelleyin (her iki yatırımcıya da bildirim gitmeli)
  
  // TODO: Boş bir satır yazdırın
  
  // TODO: Alice'in ticker aboneliğini iptal edin
  
  // TODO: Fiyatı 155.75 olarak güncelleyin (şimdi sadece Bob'a bildirim gitmeli)
}
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