首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >锈蚀介质设计模式

锈蚀介质设计模式
EN

Stack Overflow用户
提问于 2022-08-10 01:54:11
回答 1查看 131关注 0票数 1

请建议如何实施这样的设计。我知道mediator需要作为引用传递。但我不知道生命周期参数。

代码语言:javascript
复制
//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}");
}
EN

回答 1

Stack Overflow用户

发布于 2022-08-20 19:25:32

您可以在这里找到关于的详细解释--中的中介模式:https://github.com/fadeevab/mediator-pattern-rust

简言之,有两种方法:

  1. Cross-Referencing与 Rc<RefCell<..>>.这有点像一个经典的带锈的OOP。

在你的情况下,你应该

设中介=Rc::new(刷新单元::new(SyncMediator{ .);设switcher1 =Rc::new(开关器{介体: mediator.clone(),.);{让mut介体= mediator.borrow_mut();mediator.add(开关1克隆());mediator.add(开关2克隆());}

在对象之间传递引用。我称之为“天真”的方法。

  1. Top-down ownership方法,它将经典的Mediator定义应用于在Rust语言中可以安全和具体地完成的工作。您应该创建一个中介程序,转换程序,然后将转换程序的所有权转移到中介程序中,并且总体上这样做:

设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是中介。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73299823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档