Skip to content

Commit d001f8a

Browse files
author
XuhuaHuang
committed
Upload observer design pattern example
1 parent 3038796 commit d001f8a

1 file changed

Lines changed: 105 additions & 0 deletions

File tree

DesignPattern/observer.cpp

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/**
2+
* @file observer.cpp
3+
* @author Xuhua Huang
4+
* @brief
5+
* @version 0.1
6+
* @date 2026-04-12
7+
*
8+
* @copyright Copyright (c) 2026
9+
*
10+
*/
11+
12+
#include <algorithm>
13+
#include <iostream>
14+
#include <memory>
15+
#include <string>
16+
#include <vector>
17+
18+
class spreadsheet_t;
19+
20+
class graph_t {
21+
public:
22+
virtual ~graph_t() = default;
23+
24+
virtual void update(const spreadsheet_t& sheet) = 0;
25+
};
26+
27+
class spreadsheet_t {
28+
public:
29+
using observer_ptr_t = std::shared_ptr<graph_t>;
30+
31+
void attach(observer_ptr_t observer) { observers.push_back(std::move(observer)); }
32+
33+
void detach(const observer_ptr_t& observer) {
34+
std::erase_if(observers, [&](const observer_ptr_t& o) { return o == observer; });
35+
}
36+
37+
void notify() {
38+
for (auto& observer : observers) {
39+
observer->update(*this);
40+
}
41+
}
42+
43+
// Example dataset API (pull-based model)
44+
const std::vector<int>& data() const { return values; }
45+
46+
void set_data(std::vector<int> new_data) {
47+
values = std::move(new_data);
48+
notify();
49+
}
50+
51+
private:
52+
std::vector<observer_ptr_t> observers;
53+
54+
std::vector<int> values;
55+
};
56+
57+
class pie_chart_t : public graph_t {
58+
public:
59+
void update(const spreadsheet_t& sheet) override {
60+
const auto& data = sheet.data();
61+
62+
std::cout << "[PieChart] updating with data size: " << data.size() << "\n";
63+
}
64+
};
65+
66+
class bar_chart_t : public graph_t {
67+
public:
68+
void update(const spreadsheet_t& sheet) override {
69+
const auto& data = sheet.data();
70+
71+
std::cout << "[BarChart] sum = ";
72+
73+
int sum = 0;
74+
for (int v : data)
75+
sum += v;
76+
77+
std::cout << sum << "\n";
78+
}
79+
};
80+
81+
class line_chart_t : public graph_t {
82+
public:
83+
void update(const spreadsheet_t& sheet) override {
84+
const auto& data = sheet.data();
85+
86+
std::cout << "[LineChart] last value = " << (data.empty() ? 0 : data.back()) << "\n";
87+
}
88+
};
89+
90+
int main() {
91+
spreadsheet_t sheet;
92+
93+
auto pie = std::make_shared<pie_chart_t>();
94+
auto bar = std::make_shared<bar_chart_t>();
95+
auto line = std::make_shared<line_chart_t>();
96+
97+
sheet.attach(pie);
98+
sheet.attach(bar);
99+
sheet.attach(line);
100+
101+
sheet.set_data({1, 2, 3, 4, 5});
102+
sheet.set_data({10, 20, 30});
103+
104+
return 0;
105+
}

0 commit comments

Comments
 (0)