用C++ 观察者模式表示这个场景老板来了 员工工作 司机擦车 前台服务顾客 老板走了 员工炒股 前台化妆
时间: 2024-02-18 11:59:42 浏览: 29
好的,这里是用 C++ 观察者模式表示这个场景的代码:
```c++
#include <iostream>
#include <vector>
#include <string>
// 前向声明,避免循环引用
class Observer;
// 被观察者
class Subject {
public:
virtual ~Subject() {}
// 注册观察者
virtual void attach(Observer* observer) = 0;
// 移除观察者
virtual void detach(Observer* observer) = 0;
// 通知观察者
virtual void notify() = 0;
};
// 观察者
class Observer {
public:
virtual ~Observer() {}
// 更新状态
virtual void update(const std::string& message) = 0;
};
// 具体被观察者:老板
class Boss : public Subject {
public:
void attach(Observer* observer) override {
observers.push_back(observer);
}
void detach(Observer* observer) override {
for (auto it = observers.begin(); it != observers.end(); ++it) {
if (*it == observer) {
observers.erase(it);
break;
}
}
}
void notify() override {
for (auto observer : observers) {
observer->update(message);
}
}
void setMessage(const std::string& message) {
this->message = message;
notify();
}
private:
std::vector<Observer*> observers;
std::string message;
};
// 具体观察者:员工
class Employee : public Observer {
public:
Employee(const std::string& name) : name(name) {}
void update(const std::string& message) override {
std::cout << name << "收到通知:" << message << std::endl;
}
private:
std::string name;
};
// 具体观察者:司机
class Driver : public Observer {
public:
Driver(const std::string& name) : name(name) {}
void update(const std::string& message) override {
std::cout << name << "收到通知:" << message << std::endl;
}
private:
std::string name;
};
// 具体观察者:前台
class Receptionist : public Observer {
public:
Receptionist(const std::string& name) : name(name) {}
void update(const std::string& message) override {
std::cout << name << "收到通知:" << message << std::endl;
}
private:
std::string name;
};
int main() {
// 创建老板和观察者
Boss boss;
Employee employee1("员工1");
Employee employee2("员工2");
Driver driver("司机");
Receptionist receptionist("前台");
// 注册观察者
boss.attach(&employee1);
boss.attach(&employee2);
boss.attach(&driver);
boss.attach(&receptionist);
// 老板来了
boss.setMessage("老板来了,大家工作!");
// 老板走了
boss.setMessage("老板走了,员工炒股,前台化妆!");
// 移除观察者
boss.detach(&employee1);
boss.detach(&employee2);
boss.detach(&driver);
boss.detach(&receptionist);
return 0;
}
```
输出结果为:
```
员工1收到通知:老板来了,大家工作!
员工2收到通知:老板来了,大家工作!
司机收到通知:老板来了,大家工作!
前台收到通知:老板来了,大家工作!
员工1收到通知:老板走了,员工炒股,前台化妆!
员工2收到通知:老板走了,员工炒股,前台化妆!
司机收到通知:老板走了,员工炒股,前台化妆!
前台收到通知:老板走了,员工炒股,前台化妆!
```