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.
Tantangan
MudahMari 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
Investordengan methodvoid onPriceChange(String stockName, double price) - class
DayTraderyang mengimplementasikanInvestor. Class ini memiliki fieldnamedan methodonPriceChangeyang mencetak:[name] sees [stockName] at $[price] - Making quick trade! - class
LongTermInvestoryang mengimplementasikanInvestor. Class ini memiliki fieldnamedan methodonPriceChangeyang 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
- Field
- abstract class
main.dart: Impor sistem sahammu dan tunjukkan pola Observer sedang bekerja:- Buat
StockTickeruntuk saham bernamaDART - Buat
DayTraderbernamaAlicedanLongTermInvestorbernamaBob - 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)
- Buat
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)
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
file Eksternallibrary dan ImporPengantar OOPClass dan ObjectKata kunci thismethodVariabel InstanceDasar-Dasar ConstructorRingkasan: Kalkulator Sederhana4Keamanan Null
Pengantar Keamanan NullBisa Null vs Tidak Bisa NullOperator ? dan !Kata Kunci late dan Keamanan NullOperator Penanganan NullKeamanan Null dalam classRangkuman: Sistem Profil Pengguna7class Abstrak & Antarmuka
class AbstrakMethod abstrakAntarmuka di DartAntarmuka ImplisitMengimplementasikan vs MemperluasBeberapa AntarmukaRingkasan: Kalkulator Bentuk10Koleksi dan Generik
Gambaran Umum list, set, dan MapKoleksi dengan Tipe AmanKelas GenerikMetode GenerikBatasan GenerikIterable dan IteratorUlasan: Penyimpanan Generik2Konstruktor dalam Dart
Konstruktor DefaultKonstruktor BernamaInitializer ListsKonstruktor KonstanKonstruktor FactoryKonstruktor RedirectingRangkuman, Pembuat Bentuk5Enkapsulasi
Member Publik vs PrivatKonvensi Prefiks _Privasi Tingkat libraryPendalaman Getter & SetterPenyembunyian InformasiRingkasan: Catatan Siswa8Mixin
Pengantar MixinMembuat MixinMenggunakan Beberapa MixinKata Kunci on pada MixinMixin vs. PewarisanMixin vs. InterfaceRangkuman: Sistem Hewan3Property Class
Anggota Instance vs StaticField Final dan ConstVariabel LateMethod dan Field StaticGetter dan SetterRangkuman: Pengelola Rekening Bank6Pewarisan
Pewarisan DasarKata Kunci superPenimpaan methodAnotasi @overrideKata Kunci class finalKonstruktor dan PewarisanRangkuman, Hierarki Karyawan9Polimorfisme
Dasar-Dasar PolimorfismePolimorfisme melalui AntarmukaPemeriksaan Tipe saat RuntimeOperator is & asKata Kunci KovarianRangkuman: Pemroses PembayaranLatihan sendiri: Compiler Dart online