设计模式:简单的观察者模式实现(java&kotlin)

和自甴很熟 提交于 2020-08-10 02:31:03

观察者模式

观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监听一个主题对象。这样一来,当被观察者状态发生改变时,需要通知相应的观察者,使这些观察者对象能够自动更新。

观察这模式是应用比较多的一种设计模式,尤其在响应式编程中。

观察者模式又称发布-订阅模式(Publish/Subscribe),这种称呼就比较好理解了,就好像我们在bilibili上订阅了一个up主,一旦他发布了视频,就会有消息通知订阅者,up主就是发布者(观察者publisher),用publisher户就是订阅者(观察者observer)

java实现

下面我们实现一个例子,模拟up更新视频就会通知订阅者的功能

import java.util.*;

// 模拟up更新视频就会通知订阅者
class VideoUpdate extends Observable {
    private List<User> observers = new ArrayList<>(); // 存储订阅者
    // 添加dingyuezhe    
    void addOberver(User user){
        this.observers.add(user);
    }
    // 移除订阅者    
    void deleteObserver(User user){
        this.observers.remove(user);
    }
    // 通知订阅者
    void setVideoUpdate (Object id){
        this.observers.forEach(it->it.update(this, "User "+ it.name + " get a message: liangfeng publish NO."+ id +" video"));
    }
}
// 订阅者(观察者) 
class User implements Observer {
    String name;
    User(String name){
        this.name = name;
    }
    @Override
    public void update(Observable o, Object message){
        System.out.println(message);
    }
}

class ObserverPatternDemo  {
    public static void main(String[] args) {
        VideoUpdate bilibili = new VideoUpdate();
        bilibili.addOberver(new User("ffzs"));
        bilibili.addOberver(new User("sleepycat"));
        bilibili.setVideoUpdate("100");
        bilibili.setVideoUpdate("10");
    }
}

运行结果:

在这里插入图片描述

kotlin实现

kotlin 使用 Delegates.observable()实现观察的功能

它提供了3个参数,依次代表委托属性的元数据KProperty对象、旧值以及新值。可以通过新旧值做一些判断

import kotlin.properties.Delegates
// 实现接口
interface VideoUpdateListener {
    fun update(message:String)
}
// 模拟up更新视频就会通知订阅者
class VideoUpdate {
    var observers: MutableList<User> = ArrayList() // 存储订阅者
    var id: Int by Delegates.observable(0) { _, old, new ->
        observers.forEach{
            if (old==new) it.update("User ${it.name} get a message: liangfeng update NO.$id video")
            else it.update("User ${it.name} get a message: liangfeng publish NO.$id video")
        }
    }
}
// 用户类
class User(var name: String) : VideoUpdateListener {
    override fun update(message:String) {
        println(message)
    }
}
fun main(args: Array<String>) {
    val bilibili = VideoUpdate()
    bilibili.observers.add(User("ffzs"))
    bilibili.observers.add(User("sleepycat"))
    bilibili.id=100
    bilibili.id=10
    bilibili.id=10
}

运行结果:

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!