Pola Observer
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 68 dari 87.
Observer Pattern adalah pola desain perilaku yang membentuk hubungan satu-ke-banyak antara object. Saat satu object (the subject) berubah keadaan, semua dependennya (the observers) otomatis diberi tahu dan diperbarui. Bayangkan seperti berlangganan buletin: pelanggan menerima pembaruan setiap kali konten baru diterbitkan.
Pola ini melibatkan dua komponen utama: subject yang menyimpan daftar observer dan memberi tahu mereka tentang perubahan, serta observer yang mendefinisikan method update untuk merespons notifikasi:
import java.util.ArrayList;
import java.util.List;
interface Observer {
void update(String message);
}
class NewsPublisher {
private List<Observer> subscribers = new ArrayList<>();
public void subscribe(Observer observer) {
subscribers.add(observer);
}
public void unsubscribe(Observer observer) {
subscribers.remove(observer);
}
public void publish(String news) {
for (Observer subscriber : subscribers) {
subscriber.update(news);
}
}
}
class EmailSubscriber implements Observer {
private String email;
public EmailSubscriber(String email) {
this.email = email;
}
public void update(String message) {
System.out.println("Email to " + email + ": " + message);
}
}Saat penerbit merilis berita, semua pelanggan diberi tahu secara otomatis:
NewsPublisher publisher = new NewsPublisher();
publisher.subscribe(new EmailSubscriber("alice@mail.com"));
publisher.subscribe(new EmailSubscriber("bob@mail.com"));
publisher.publish("Breaking news!");
// output:
// Email to alice@mail.com: Breaking news!
// Email to bob@mail.com: Breaking news!Observer Pattern mendorong keterikatan yang longgar: subject tidak perlu mengetahui class konkret dari para observer-nya, hanya bahwa mereka mengimplementasikan antarmuka Observer. Ini memudahkan penambahan tipe observer baru tanpa mengubah subject.
Tantangan
MudahMari kita buat sistem peringatan harga saham menggunakan Observer Pattern! Kamu akan membuat sistem yang memungkinkan ticker saham memberi tahu beberapa investor setiap kali harga saham berubah, sehingga setiap investor dapat bereaksi terhadap pembaruan harga dengan caranya sendiri.
Kamu akan mengatur kodemu dalam empat file:
Observer.java: Definisikan interfaceObserveryang akan diimplementasikan oleh semua investor. Interface ini harus mendeklarasikan satu methodupdate(String stockName, double price)yang digunakan observer untuk menerima pemberitahuan tentang perubahan harga.StockTicker.java: Buat class subjek yang menyimpan list observer dan memberi tahu mereka tentang perubahan harga.StockTickerharus memiliki:Field String privat untuk nama saham, yang ditetapkan melalui konstruktor.
Field double privat untuk harga saat ini, yang awalnya bernilai 0.
List privat untuk menyimpan observer yang berlangganan.
Method
subscribe(Observer observer)yang menambahkan observer ke list.Method
unsubscribe(Observer observer)yang menghapus observer dari list.Method
setPrice(double price)yang memperbarui harga, lalu memberi tahu semua observer dengan memanggil methodupdatemereka menggunakan nama saham dan harga baru.Investors.java: Buat dua jenis investor berbeda yang mengimplementasikan interfaceObserver:DayTrader: memiliki field nama privat yang ditetapkan melalui konstruktor. Saat diperbarui, class ini mencetak[name] received alert: [stockName] is now $[price] - Making quick trade!LongTermInvestor: memiliki field nama privat yang ditetapkan melalui konstruktor. Saat diperbarui, class ini mencetak[name] received alert: [stockName] is now $[price] - Holding steady.Format harga dengan dua angka di belakang koma.
Main.java: Satukan sistem observer-mu! Kamu akan menerima tiga input: nama saham (String), pembaruan harga pertama (double), dan pembaruan harga kedua (double).Buat
StockTickerdengan nama saham yang diberikan. BuatDayTraderbernama"Alice"danLongTermInvestorbernama"Bob", lalu daftarkan keduanya ke ticker.Tetapkan harga ke nilai input pertama, semua observer akan diberi tahu. Lalu berhentikan langganan Alice. Terakhir, tetapkan harga ke nilai input kedua, kali ini hanya Bob yang akan diberi tahu.
Kamu akan menerima tiga input secara berurutan: nama saham (String), harga pertama (double), harga kedua (double).
Tantangan ini menunjukkan keunggulan Observer Pattern: StockTicker tidak mengetahui apa pun tentang jenis investor tertentu. Class ini hanya mengetahui bahwa mereka mengimplementasikan Observer. Saat kamu berhenti berlangganan Alice, ia tidak lagi menerima pembaruan, sementara Bob terus diberi tahu. Coupling yang longgar ini memudahkanmu menambahkan jenis investor baru tanpa mengubah ticker!
Coba sendiri
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Baca input
String stockName = scanner.nextLine();
double firstPrice = scanner.nextDouble();
double secondPrice = scanner.nextDouble();
// TODO: Buat StockTicker dengan nama saham yang diberikan
// TODO: Buat DayTrader bernama "Alice"
// TODO: Buat LongTermInvestor bernama "Bob"
// TODO: Daftarkan Alice dan Bob ke ticker
// TODO: Atur harga ke firstPrice (kedua pengamat menerima pemberitahuan)
// TODO: Batalkan pendaftaran Alice
// TODO: Atur harga ke secondPrice (hanya Bob yang menerima pemberitahuan)
scanner.close();
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem PembayaranLatihan sendiri: Compiler Java online