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.
Görev
KolayObserver 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:Investoradlı,void onPriceChange(String stockName, double price)metoduna sahip soyut bir sınıfDayTraderarayüzünü uygulayanInvestoradlı bir sınıf. Birnamealanına sahiptir veonPriceChangemetodu şunu yazdırır:[name] sees [stockName] at $[price] - Making quick trade!LongTermInvestorarayüzünü uygulayanInvestoradlı bir sınıf. Birnamealanına sahiptir veonPriceChangemetodu şunu yazdırır:[name] notes [stockName] at $[price] - Holding steady.- Şunlara sahip bir
StockTickersınıfı (özne):- Bir
String stockNamealanı - 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
- Bir
main.dart: Hisse senedi sistemini içe aktar ve Observer kalıbını çalışırken göster:StockTickeradlı bir hisse senedi için birDARToluşturDayTraderadlı birAliceveLongTermInvestoradlı birBoboluştur- Her iki yatırımcıyı da göstergeye abone et
- Fiyatı
150.50olarak 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.75olarak 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)
}
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