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 investorOutput:
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 $155Poin 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.
Tantangan
SedangImplementasikan 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)
- Memanggil konstruktor induk menggunakan
- 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
- Menerima parameter
- 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]CContoh 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.5CCatatan Penting:
- Method
attach()dandetach()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
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 vs objectParameter selfmethodAtributMethod Konstruktor (__init__)Rangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan DasarFungsi super()Penimpaan MethodPewarisan BergandaUrutan Resolusi MethodRingkasan: Hierarki Karyawan5Polimorfisme
Meninjau Ulang Method OverridingDuck Typingclass dan method AbstrakDesain InterfaceRingkasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanMixinsMetode Statis dan Metode ClassDecorator ClassPengelola Konteks11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola Composite3Property class
Variabel instance vs variabel classDekorator propertyAtribut privatRangkuman: Pengelola Rekening Bank6Enkapsulasi
Anggota Public, Protected, PrivateModifier AksesPenyembunyian InformasiDecorator Property Tingkat LanjutUlasan: Sistem Catatan Siswa12Proyek: Manajemen Perpustakaan
Ikhtisar Proyekclass Buku dan PenggunaSistem PeminjamanFitur PencarianAntarmuka AdminPengujian dan IntegrasiLatihan sendiri: Compiler Python online