Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 interface Observer yang akan diimplementasikan oleh semua investor. Interface ini harus mendeklarasikan satu method update(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. StockTicker harus 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 method update mereka menggunakan nama saham dan harga baru.

  • Investors.java: Buat dua jenis investor berbeda yang mengimplementasikan interface Observer:

    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 StockTicker dengan nama saham yang diberikan. Buat DayTrader bernama "Alice" dan LongTermInvestor bernama "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();
    }
}
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 Java online