rust初体验之观察者模式

项目环境

1.idea 2019.1.3
2.rust 1.20.2 (13979c968 2019-10-16)

实现思路

抽象观察者
trait Observer {
    fn update(&self, msg: &str);
}
抽象被观察者接口
trait Observerable {
   fn register_observer(&mut self, obj: Box<dyn Observer>);
   fn remove_observer(&mut self, index: usize);
   fn notify_observer(&self);
}
主要实现:
struct WechatServer {
    msg: &'static str,
    list: Vec<Box<dyn Observer>>
}

impl WechatServer {
    fn new() -> WechatServer{
        return WechatServer{
            list: Vec::new(),
            msg: ""
        };
    }

	// 发送消息通知
    fn set_data_msg(&mut self, msg: &'static str) {
        self.msg = msg;
        self.notify_observer();
    }
}

impl Observerable for WechatServer {
    fn register_observer(&mut self, obj: Box<dyn Observer>) {
        self.list.push(obj)
    }
    
	fn remove_observer(&mut self, index: usize) {
        self.list.remove(index);
    }
    
    fn notify_observer(&self) {
        for obj in self.list.iter() {
            obj.update(self.msg);
        }
    }
}
struct User {
    name: &'static str
}

impl Observer for User{
    fn update(&self, msg: &str) {
        println!("{} -> 收到消息: {}", self.name, msg);
    }
}
调用
fn main() {
    let mut server = WechatServer::new();
    
    server.register_observer(Box::new(User{name:"张三"}));
    server.register_observer(Box::new(User{name:"李四"}));
    server.register_observer(Box::new(User{name:"王五"}));

    server.set_data_msg("这是测试消息");
    server.register_observer(Box::new(User{name:"赵六"}));
    server.remove_observer(1);
    server.register_observer(Box::new(User{name:"田七"}));
    server.set_data_msg("rust是最棒的");
}

总结

通过dyn标记数据类型是trait ,达到其它语言中接口做参数或返回值的效果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值