Menu
CoddyTech

Pola Observer

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 92 dari 110.

Observer pattern membentuk hubungan satu ke banyak antar-object: saat satu object (subjek) berubah keadaan, semua object yang bergantung padanya (observer) otomatis menerima pemberitahuan. Pola ini cocok untuk situasi seperti pembaruan UI, sistem event, atau situasi apa pun ketika beberapa bagian aplikasimu perlu merespons perubahan.

Pola ini melibatkan dua peran utama: Subjek yang menyimpan daftar pengamat dan memberi tahu mereka tentang perubahan, serta Pengamat yang mendaftarkan diri dan merespons pembaruan:

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!
}

Saat publishNews dipanggil, agensi melakukan perulangan pada semua observer yang berlangganan dan memanggil method update mereka. Observer dapat berlangganan atau berhenti berlangganan kapan saja, sehingga sistem menjadi fleksibel dan tidak terikat erat. Subject tidak perlu mengetahui tipe spesifik observer-nya.

challenge icon

Tantangan

Mudah

Mari kita buat sistem peringatan harga saham menggunakan pola Observer! Kamu akan membuat sistem yang memungkinkan ticker saham memberi tahu beberapa investor setiap kali harga berubah, sehingga setiap investor dapat bereaksi terhadap pembaruan pasar dengan caranya sendiri.

Kamu akan mengatur kodemu ke dalam dua file:

  • stock_system.dart: Buat sistem observer-mu di sini:
    • abstract class Investor dengan method void onPriceChange(String stockName, double price)
    • class DayTrader yang mengimplementasikan Investor. Class ini memiliki field name dan method onPriceChange yang mencetak: [name] sees [stockName] at $[price] - Making quick trade!
    • class LongTermInvestor yang mengimplementasikan Investor. Class ini memiliki field name dan method onPriceChange yang mencetak: [name] notes [stockName] at $[price] - Holding steady.
    • class StockTicker (subjek) dengan:
      • Field String stockName
      • list privat untuk menyimpan investor yang berlangganan
      • method subscribe(Investor investor) untuk menambahkan investor
      • method unsubscribe(Investor investor) untuk menghapus investor
      • method updatePrice(double newPrice) yang memberi tahu semua investor yang berlangganan tentang harga baru
  • main.dart: Impor sistem sahammu dan tunjukkan pola Observer sedang bekerja:
    • Buat StockTicker untuk saham bernama DART
    • Buat DayTrader bernama Alice dan LongTermInvestor bernama Bob
    • Langganankan kedua investor ke ticker
    • Perbarui harga menjadi 150.50 (kedua investor seharusnya diberi tahu)
    • Cetak satu baris kosong
    • Hentikan langganan Alice dari ticker
    • Perbarui harga menjadi 155.75 (sekarang hanya Bob yang seharusnya diberi tahu)

Ini menunjukkan bagaimana pola Observer membuat sistem yang keterikatannya longgar. StockTicker tidak perlu mengetahui apakah yang diberi tahu adalah day trader atau investor jangka panjang, ticker cukup memanggil onPriceChange pada siapa pun yang berlangganan!

Output yang diharapkan:

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.

Coba sendiri

import 'stock_system.dart';

void main() {
  // TODO: Buat StockTicker untuk saham bernama 'DART'
  
  // TODO: Buat DayTrader bernama 'Alice'
  
  // TODO: Buat LongTermInvestor bernama 'Bob'
  
  // TODO: Daftarkan kedua investor ke ticker
  
  // TODO: Perbarui harga menjadi 150.50 (kedua investor harus menerima notifikasi)
  
  // TODO: Cetak baris kosong
  
  // TODO: Hentikan langganan Alice dari ticker
  
  // TODO: Perbarui harga menjadi 155.75 (sekarang hanya Bob yang harus menerima notifikasi)
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Dart online