Pola Observer
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 94 dari 104.
Pola Observer menetapkan dependensi satu-ke-banyak antara object: ketika satu object (subjek) mengubah status, semua object yang bergantung padanya (observer) akan diberi tahu secara otomatis. Pola ini ideal untuk sistem peristiwa, pembaruan UI, atau situasi apa pun ketika beberapa object perlu bereaksi terhadap perubahan.
Pola ini melibatkan dua peran utama: Subject yang menyimpan daftar pengamat dan memberi tahu mereka, serta Observers yang mengimplementasikan antarmuka pembaruan:
#include <iostream>
#include <vector>
#include <algorithm>
class Observer {
public:
virtual void update(int value) = 0;
virtual ~Observer() = default;
};
class Subject {
std::vector<Observer*> observers;
int state = 0;
public:
void attach(Observer* obs) {
observers.push_back(obs);
}
void detach(Observer* obs) {
observers.erase(
std::remove(observers.begin(), observers.end(), obs),
observers.end());
}
void setState(int value) {
state = value;
notify();
}
void notify() {
for (Observer* obs : observers) {
obs->update(state);
}
}
};
class Display : public Observer {
std::string name;
public:
Display(const std::string& n) : name(n) {}
void update(int value) override {
std::cout << name << " received: " << value << "\n";
}
};
int main() {
Subject sensor;
Display screen1("Screen1"), screen2("Screen2");
sensor.attach(&screen1);
sensor.attach(&screen2);
sensor.setState(42); // Kedua layar menerima pemberitahuan
}Saat setState() dipanggil, subject menelusuri semua observer yang terdaftar dan memanggil method update() milik mereka. Observer dapat terhubung atau terlepas kapan saja, sehingga sistem menjadi fleksibel dan tidak terikat erat.
Gunakan Observer ketika perubahan pada satu object mengharuskan object lain diperbarui, dan kamu tidak ingin object-object ini saling terikat erat.
Tantangan
MudahMari buat sistem pemantauan Weather Station menggunakan pola Observer. Kamu akan membuat stasiun cuaca yang melacak data suhu dan secara otomatis memberi tahu beberapa unit display setiap kali suhu berubah: penerapan pola ini yang klasik di dunia nyata.
Kamu akan menyusun kodemu dalam tiga file:
Observer.h: Definisikan interface observer dan observer display konkret.Buat class
Observerabstrak dengan method virtual murniupdate(double temperature)yang diimplementasikan observer untuk menerima notifikasi, serta destructor virtual.Lalu buat class
TemperatureDisplayyang mewarisiObserver. Setiap display memiliki nama (string) yang ditetapkan melalui konstruktornya. Saatupdate()dipanggil, class tersebut harus mencetak:[DisplayName]: Temperature is [temperature] degreesWeatherStation.h: Buat subject yang menyimpan suhu dan memberi tahu observer.Class
WeatherStationharus:- Menyimpan list pointer observer dan suhu saat ini (inisialisasi ke
0.0) - Memiliki method
attach(Observer* obs)untuk mendaftarkan observer - Memiliki method
detach(Observer* obs)untuk menghapus observer - Memiliki method
setTemperature(double temp)yang memperbarui suhu dan memberi tahu semua observer yang terpasang - Memiliki method
notify()privat yang memanggilupdate()pada setiap observer dengan suhu saat ini
- Menyimpan list pointer observer dan suhu saat ini (inisialisasi ke
main.cpp: Peragakan pola Observer dalam praktik.Baca tiga input:
- Nama untuk display pertama (string)
- Nama untuk display kedua (string)
- Nilai suhu (double)
Buat
WeatherStationdan dua objectTemperatureDisplaydengan nama yang diberikan. Pasang kedua display ke stasiun, lalu atur suhu ke nilai input. Kedua display akan otomatis menerima pembaruan dan mencetak pesannya.Setelah itu, lepaskan display pertama dan atur suhu baru yang 5 derajat lebih tinggi daripada input. Hanya display kedua yang akan menerima pembaruan ini.
Contohnya, dengan input Kitchen, Bedroom, dan 22.5:
Kitchen: Temperature is 22.5 degrees
Bedroom: Temperature is 22.5 degrees
Bedroom: Temperature is 27.5 degreesDengan input Office, Lobby, dan 18.0:
Office: Temperature is 18 degrees
Lobby: Temperature is 18 degrees
Lobby: Temperature is 23 degreesPerhatikan bagaimana pola Observer menciptakan sistem dengan keterikatan longgar: stasiun cuaca tidak perlu mengetahui apa pun tentang display tertentu, stasiun hanya memberi tahu siapa pun yang sedang mendengarkan. Saat kamu melepaskan observer, observer tersebut otomatis berhenti menerima pembaruan.
Coba sendiri
#include <iostream>
#include <string>
#include "WeatherStation.h"
using namespace std;
int main() {
// Baca input
string display1Name, display2Name;
double temperature;
cin >> display1Name;
cin >> display2Name;
cin >> temperature;
// TODO: Buat object WeatherStation
// TODO: Buat dua object TemperatureDisplay dengan nama dari input
// TODO: Hubungkan kedua display ke stasiun cuaca
// TODO: Atur suhu ke nilai input
// (Kedua display harus mencetak pesannya)
// TODO: Lepaskan display pertama
// TODO: Atur suhu menjadi 5 derajat lebih tinggi daripada input
// (Hanya display kedua yang harus mencetak pesan)
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan10Gambaran Umum STL
Gambaran Umum dan Filosofi STLKontainer STLIteratorAlgoritma STLFunctor dan Ekspresi LambdaRangkuman: Frekuensi Kata13Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonFactory dan Abstract FactoryPola BuilderPola ObserverPola Strategy2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online