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 ,达到其它语言中接口做参数或返回值的效果

发布了6 篇原创文章 · 获赞 2 · 访问量 5611

猜你喜欢

转载自blog.csdn.net/u010766458/article/details/103454356