观察者模式
观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监听一个主题对象。这样一来,当被观察者状态发生改变时,需要通知相应的观察者,使这些观察者对象能够自动更新。
观察这模式是应用比较多的一种设计模式,尤其在响应式编程中。
观察者模式又称发布-订阅模式(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
}
运行结果:
来源:oschina
链接:https://my.oschina.net/u/4344191/blog/4274866