请建议如何实施这样的设计。我知道mediator需要作为引用传递。但我不知道生命周期参数。
//Colleague
struct Switcher {
state: bool,
mediator: SyncMediator
}
impl Switcher {
fn sync(self) {
self.mediator.sync(self.state);
}
fn get_state(&self) -> bool {
return self.state;
}
fn set_state(&mut self, value: bool) {
self.state = value;
}
}
//ConcreteMediator
struct SyncMediator {
switchers: Vec<Switcher>
}
impl SyncMediator {
fn sync(mut self, state: bool) {
for i in 0..self.switchers.len() {
self.switchers[i].set_state(state);
}
}
fn add(&mut self, switcher: Switcher) {
self.switchers.push(switcher);
}
}
fn main() {
//Client
let mediator = SyncMediator {
switchers: vec![] };
let mut switcher1 = Switcher {
mediator: mediator, state: false };
let switcher2 = Switcher {
mediator: mediator, state: false };
let switcher3 = Switcher {
mediator: mediator, state: false };
switcher1.set_state(true);
let mut state2 = switcher2.get_state();
//state2 is false
let mut state3 = switcher3.get_state();
//state3 is false
println!("state2 is {state2}");
println!("state2 is {state3}");
switcher1.sync();
state2 = switcher2.get_state();
//state2 is true
state3 = switcher3.get_state();
//state3 is true
println!("state2 is {state2}");
println!("state2 is {state3}");
}发布于 2022-08-20 19:25:32
您可以在这里找到关于的详细解释--中的中介模式:https://github.com/fadeevab/mediator-pattern-rust
简言之,有两种方法:
Rc<RefCell<..>>.这有点像一个经典的带锈的OOP。在你的情况下,你应该
设中介=Rc::new(刷新单元::new(SyncMediator{ .);设switcher1 =Rc::new(开关器{介体: mediator.clone(),.);{让mut介体= mediator.borrow_mut();mediator.add(开关1克隆());mediator.add(开关2克隆());}
在对象之间传递引用。我称之为“天真”的方法。
设mut mediator = SyncMediator { ..};设switcher1 = Switcher { name:"switcher1",.};mediator.add(switcher1);mediator.add(switcher2);//然后,在顶层与中介一起工作。mediator.set_state("switcher1",真);
当开关接收中介对象作为函数参数时:
脉冲开关{ fn set_state(&mut self,value: bool,mediator:&mut SyncMediator) { self.state = value;mediator.sync();}
P.S.:下面的图像演示了可视化组件之间的交互示例,其中Dialog是中介。

https://stackoverflow.com/questions/73299823
复制相似问题