Menu
CoddyTech

Pola Observer

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Python di Coddy. Pelajaran 47 dari 64.

Observer Pattern membuat hubungan satu-ke-banyak ketika satu object (subjek) memberi tahu beberapa object (pengamat) saat statusnya berubah.

Berikut class Subject sederhana yang mengelola observer:

class Subject:
    def __init__(self):
        self._observers = []
    
    def add_observer(self, observer):
        self._observers.append(observer)
    
    def notify(self, message):
        for observer in self._observers:
            observer.update(message)

Subject menyimpan daftar observer dan dapat memberi tahu semuanya sekaligus.

Buat class observer sederhana:

class EmailNotifier:
    def update(self, message):
        print(f"Email sent: {message}")

class SMSNotifier:
    def update(self, message):
        print(f"SMS sent: {message}")

Setiap observer memiliki method update yang dipanggil saat diberi tahu.

Gunakan pola observer:

# Buat subject
news = Subject()

# Buat observer
email = EmailNotifier()
sms = SMSNotifier()

# Tambahkan observer ke subject
news.add_observer(email)
news.add_observer(sms)

# Beri tahu semua observer
news.notify("Breaking news: Python is awesome!")

Buat contoh praktis dengan pelacak harga saham:

class Stock:
    def __init__(self, symbol, price):
        self.symbol = symbol
        self._price = price
        self._observers = []
    
    def add_observer(self, observer):
        self._observers.append(observer)
    
    def set_price(self, price):
        self._price = price
        self.notify()
    
    def notify(self):
        for observer in self._observers:
            observer.update(self.symbol, self._price)

class Investor:
    def __init__(self, name):
        self.name = name
    
    def update(self, symbol, price):
        print(f"{self.name} notified: {symbol} is now ${price}")

# Gunakan pelacak saham
apple_stock = Stock("AAPL", 150)

investor1 = Investor("Alice")
investor2 = Investor("Bob")

apple_stock.add_observer(investor1)
apple_stock.add_observer(investor2)

apple_stock.set_price(155)  # Memberi tahu semua investor

Output:

Email sent: Breaking news: Python is awesome!
SMS sent: Breaking news: Python is awesome!
Alice notified: AAPL is now $155
Bob notified: AAPL is now $155

Poin penting: Observer Pattern memungkinkan satu object memberi tahu banyak object lain secara otomatis saat terjadi perubahan. Subject menyimpan list observer dan memanggil method update mereka saat diperlukan. Ini berguna untuk notifikasi, sistem event, dan menjaga agar beberapa bagian aplikasimu tetap tersinkronisasi.

challenge icon

Tantangan

Sedang

Implementasikan Observer Pattern dengan membuat sistem pemantauan cuaca. Kamu perlu membuat dua class di bagian kode yang ditentukan.

Langkah 1: Buat class WeatherStation

Tulis class WeatherStation di tempat yang ditunjukkan oleh komentar. Class ini harus:

  • Mewarisi class Subject (gunakan class WeatherStation(Subject):)
  • Melakukan inisialisasi dengan:
    • Memanggil konstruktor induk menggunakan super().__init__()
    • Mengatur suhu awal ke 0 menggunakan atribut dengan satu garis bawah self._temperature (konvensi Python untuk atribut internal)
  • Mengimplementasikan set_temperature(self, temperature):
    • Memperbarui atribut suhu internal
    • Memanggil self.notify(self._temperature) untuk memberi tahu semua observer
  • Mengimplementasikan get_temperature(self):
    • Mengembalikan nilai suhu saat ini

Langkah 2: Buat class WeatherDisplay

Tulis class WeatherDisplay di tempat yang ditunjukkan oleh komentar. Class ini harus:

  • Mewarisi class Observer (gunakan class WeatherDisplay(Observer):)
  • Melakukan inisialisasi dengan:
    • Menerima parameter name
    • Menyimpan nama sebagai self.name
  • Mengimplementasikan update(self, temperature):
    • Mencetak pesan pembaruan suhu dengan format persis seperti yang ditunjukkan di bawah

Format Pesan:

Saat display menerima pembaruan suhu, display harus mencetak tepat:

Display [name]: Current temperature is [temperature]C

Contoh Penggunaan:

# Create weather station and displays
station = WeatherStation()
phone_display = WeatherDisplay("Phone")
tablet_display = WeatherDisplay("Tablet")

# Attach displays to station
station.attach(phone_display)
station.attach(tablet_display)

# Update temperature - both displays will be notified
station.set_temperature(25.5)

# Output:
# Display Phone: Current temperature is 25.5C
# Display Tablet: Current temperature is 25.5C

Catatan Penting:

  • Method attach() dan detach() sudah diimplementasikan di class dasar Subject. Kamu tidak perlu mengimplementasikan atau memanggilnya di class WeatherStation
  • Dalam contoh penggunaan di atas, station.attach(phone_display) dipanggil oleh pengguna class-mu, bukan di dalam implementasi WeatherStation
  • WeatherStation hanya perlu memanggil self.notify() saat suhu berubah. Class dasar Subject menangani sisanya
  • Fokuslah mengimplementasikan tiga method yang diwajibkan di WeatherStation dan dua method yang diwajibkan di WeatherDisplay seperti yang dijelaskan di atas

Coba sendiri

class Subject:
    def __init__(self):
        self._observers = []
    
    def attach(self, observer):
        self._observers.append(observer)
        
    def detach(self, observer):
        self._observers.remove(observer)
        
    def notify(self, data):
        for observer in self._observers:
            observer.update(data)
            
class Observer:
    def update(self, data):
        pass

# Tulis class WeatherStation milikmu di sini

# Tulis class WeatherDisplay milikmu di sini

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 Python online