DBA学RUST设计模式--观察者模式
时间:2021-07-01 10:21:17
帮助过:15人阅读
struct Work {
//消息实体,存储消息
id: i32
}
struct WorkMaster {
//消息管理者属性
workers: Vec<Box<Worker>>
//存储注册的接收者。每个接收者须实现Worker接口才能注册进。
}
impl WorkMaster {
fn register_worker(&mut self, worker: Box<Worker>) {
//注册接收者
self.workers.push(worker);
}
fn dispatch_new_work(&self, work: Work) {
//为接收者队列中的每个成员发送通知
for worker
in &
self.workers {
worker.on_new_work(work.clone())//由于每个接收者都实现了Worker接口,此处可方便的调用实例化的接收者方法
}
}
}
trait Worker {
fn on_new_work(&self, work: Work);
//self:消息接收者(列表) work:消息实体
}
//通过构建不同的接收者,将消息发送与接收分离。
//接收者为彼此独立的结构体,而发送者维护一个存储了接收者的vec列表
//也可理解为,当WorkMaster状态发生改变时,所有依赖于他的对象都会接收到通知
struct LocalWorker {}
impl Worker for LocalWorker {
fn on_new_work(&
self, work: Work) {
println!(
"local worker receiver new work {:?}", work)
}
}
struct RemoteWorker {}
impl Worker for RemoteWorker {
fn on_new_work(&
self, work: Work) {
println!(
"remote worker receive new work {:?}", work)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn observer_mode_test() {
let mut master = WorkMaster{workers: Vec::new()};
let local_worker = LocalWorker{};
let remote_worker = RemoteWorker{};
master.register_worker(Box::new(local_worker));
master.register_worker(Box::new(remote_worker));
// local worker receiver new work Work { id: 1 }
// remote worker receive new work Work { id: 1 }
master.dispatch_new_work(Work{id: 1});
}
}
WorkMaster通过关联函数dispatch_new_work,通知接收者自己状态发生了改变。
DBA学RUST设计模式--观察者模式
标签:div color 方法 int 发送 观察者模式 自己 实例 remote