4. 观察者模式(Observer Pattern)
如果你有多个界面或组件需要响应任务参数的变化,可以使用观察者模式。当任务参数发生变化时,所有需要更新的界面或模块都会自动得到通知,并做出响应。比如,某个界面修改了参数,其他界面(例如显示结果或更新单位)可以自动刷新。
示例:
class TaskParametersObserver {
public:
virtual void update() = 0; // 更新方法
};
class TaskParameters {
private:
QList<TaskParametersObserver*> observers;
public:
void addObserver(TaskParametersObserver* observer) {
observers.append(observer);
}
void notifyObservers() {
for (TaskParametersObserver* observer : observers) {
observer->update(); // 通知所有观察者
}
}
void changeParameter() {
// 当参数改变时
notifyObservers();
}
};
这个代码实现的是 观察者模式(Observer Pattern),它的核心思想是当一个对象的状态发生变化时,自动通知所有依赖于它的对象,并进行相应的处理。在这个实现中,TaskParameters
是 被观察者,TaskParametersObserver
是 观察者。
代码解释
1. TaskParametersObserver
类
这是一个抽象类,代表一个观察者。每个观察者都有一个 update()
方法,表示当被观察的对象(在这里是 TaskParameters
)的状态发生变化时,观察者会做出响应。
class TaskParametersObserver {
public:
virtual void update() = 0; // 更新方法
};
update()
是一个纯虚函数,所有具体的观察者类必须实现这个方法,来定义在状态改变时的具体反应。
2. TaskParameters
类
这是 被观察者,也就是当状态改变时,通知所有观察者的类。它维护了一个 observers
列表,记录所有注册的观察者。
class TaskParameters {
private:
QList<TaskParametersObserver*> observers;
public:
void addObserver(TaskParametersObserver* observer) {
observers.append(observer);
}
void notifyObservers() {
for (TaskParametersObserver* observer : observers) {
observer->update(); // 通知所有观察者
}
}
void changeParameter() {
// 当参数改变时
notifyObservers();
}
};
addObserver()
:这个方法用于将一个观察者(TaskParametersObserver
)加入到观察者列表observers
中。notifyObservers()
:当被观察者(TaskParameters
)的状态发生变化时,调用这个方法来通知所有已注册的观察者。它会遍历observers
列表,并调用每个观察者的update()
方法,通知它们状态发生了变化。changeParameter()
:当任务参数发生变化时,调用changeParameter()
方法,它会触发notifyObservers()
,从而通知所有观察者参数已经改变。
3. 如何通知的
当 changeParameter()
被调用时,它会触发 notifyObservers()
,然后程序遍历所有已注册的观察者,并对每个观察者调用它的 update()
方法。
这意味着,每个观察者在 update()
中可以编写自己的逻辑,来响应任务参数变化。例如,某个界面(观察者)可能会根据任务参数的变化,更新显示的数据。
示例使用场景
假设我们有一个界面 TaskParametersUI
作为观察者,它显示任务参数。每当 TaskParameters
中的参数变化时,TaskParametersUI
就会更新界面。
观察者实现:
class TaskParametersUI : public TaskParametersObserver {
public:
void update() override {
// 这里可以编写更新界面显示的代码,比如更新UI中的文本框值
qDebug() << "Task parameters have changed, updating UI!";
}
};
使用场景:
int main() {
// 创建任务参数对象(被观察者)
TaskParameters taskParameters;
// 创建一个界面观察者
TaskParametersUI ui;
// 注册观察者
taskParameters.addObserver(&ui);
// 任务参数发生变化,通知所有观察者
taskParameters.changeParameter();
return 0;
}
在这个例子中:
TaskParameters
是被观察者,当其参数发生变化时,会通知所有观察者。TaskParametersUI
是一个具体的观察者,它在update()
方法中响应参数变化并更新界面。- 当
changeParameter()
被调用时,TaskParameters
会通知所有注册的观察者(在这里是TaskParametersUI
),并执行它们的update()
方法。
总结
- 观察者模式 的目的是让一个对象(被观察者)在状态变化时,自动通知所有注册的对象(观察者),而观察者再根据变化做出响应。
TaskParameters
类作为被观察者,维护了所有观察者,并在参数变化时调用update()
来通知它们。- 观察者类(如
TaskParametersUI
)实现update()
方法来处理变化后的业务逻辑。
这样可以解耦 TaskParameters
和界面更新的逻辑,使得当 TaskParameters
的状态变化时,无需直接操作界面,只需要通知所有观察者,界面会自动更新。