1.subject类里有三个方法attach,detach和notify,都是public的。2.ATM类继承自subject,有takeoutcard、readcard、putincard、readpassword方法。3.observe类中有一个update函数4.user类继承自observe类,有deposit、check balance、withdraw、transfer、changepassword、checkbalance函数。请用c++帮我写。
时间: 2023-07-10 19:29:49 浏览: 131
好的,以下是代码实现:
```c++
#include <iostream>
#include <vector>
using namespace std;
// 观察者基类
class Observer {
public:
virtual void update() = 0;
};
// 被观察者基类
class Subject {
public:
void attach(Observer* observer) {
m_observers.push_back(observer);
}
void detach(Observer* observer) {
for (int i = 0; i < m_observers.size(); i++) {
if (m_observers[i] == observer) {
m_observers.erase(m_observers.begin() + i);
break;
}
}
}
void notify() {
for (int i = 0; i < m_observers.size(); i++) {
m_observers[i]->update();
}
}
protected:
vector<Observer*> m_observers;
};
// ATM类,继承自Subject
class ATM : public Subject {
public:
void takeoutcard() {
// 取卡操作
// ...
// 通知观察者
notify();
}
void readcard() {
// 读卡操作
// ...
// 通知观察者
notify();
}
void putincard() {
// 放卡操作
// ...
// 通知观察者
notify();
}
void readpassword() {
// 读密码操作
// ...
// 通知观察者
notify();
}
};
// 用户类,继承自Observer
class User : public Observer {
public:
User(ATM* atm) {
m_atm = atm;
m_atm->attach(this);
}
~User() {
m_atm->detach(this);
}
void deposit() {
// 存款操作
// ...
cout << "存款成功,余额已更新" << endl;
}
void check_balance() {
// 查询余额操作
// ...
cout << "您的余额为:" << m_balance << endl;
}
void withdraw() {
// 取款操作
// ...
cout << "取款成功,余额已更新" << endl;
}
void transfer() {
// 转账操作
// ...
cout << "转账成功,余额已更新" << endl;
}
void change_password() {
// 修改密码操作
// ...
cout << "密码已修改" << endl;
}
void checkbalance() {
// 查询余额操作
// ...
cout << "您的余额为:" << m_balance << endl;
}
void update() {
cout << "收到通知,余额已更新" << endl;
}
private:
ATM* m_atm;
int m_balance;
};
int main() {
ATM atm;
User user(&atm);
atm.takeoutcard();
atm.readcard();
atm.putincard();
atm.readpassword();
user.deposit();
user.check_balance();
user.withdraw();
user.transfer();
user.change_password();
user.checkbalance();
return 0;
}
```
在上面的代码中,我们新增了 `ATM` 类中的 `readcard`、`putincard` 和 `readpassword` 方法,分别表示读卡、放卡和读密码操作。我们还新增了 `User` 类中的 `withdraw`、`transfer`、`change_password` 和 `checkbalance` 方法,分别表示取款、转账、修改密码和查询余额操作。
在 `main` 函数中,我们依次进行了取卡、读卡、放卡、读密码、存款、查询余额、取款、转账、修改密码和查询余额等操作。当用户进行这些操作时,会触发对应的通知,更新用户的余额信息。
阅读全文