Java设计模式之观察者模式(简单介绍加代码小例子)
【Java设计模式之观察者模式(简单介绍加代码小例子)】??观察者模式是Java23个设计模式之一,也是我们最常用到的设计模式之一,我们用到的很多第三方库都用到了观察者模式。比如:EventBus,RxJava,LiveData 等等。观察者模式可以描述为有一个被观察者,还有一个或多个观察者,当被观察者有变化时,观察者能收到这些变化,可以说是一对多的关系。被观察者可以理解为一个信息的发布者,观察者可以理解为信息的订阅者(接收者),每当发布者发布信息的消息时,订阅者都会接收到。
??这里得先提一下Java的回调方法,个人认为回调方法和观察者模式是一样的,只不过回调方法是一对一的关系,可以说是观察者只有一个。
??下面通过一个简单的小例子说明观察者模式是如何实现的:
这里有一个哔哩哔哩的up主(发布视频)和多个用户(接收视频更新消息),用户可以订阅(关注)up主,这样up主发布新的视频,订阅用户那面就都能实时收到更新消息了。
首先定义抽象的观察者:
/**
* 抽象观察者
*/interface Observer {
/**
* 当被观察者有变化时,被观察者会通过持有的观察者引用,回调此方法
*/
void update(String message);
}
定义抽象的被观察者:
/**
* 抽象的被观察者
*/interface Observable {
/**
* 注册观察者对象
* @param o
*/
void registerObserver(Observer o);
/**
* @param o 移除观察者对象
*/
void removeObserver(Observer o);
/**
* 被观察者发生变化时,通知观察者
*/
void notifyObservers();
}
定义Bilibili视频UP主类,并实现抽象被观察者接口:
/**
* Bilibili视频UP主
*/class BiliUper implements Observable {
private List observerList;
// 观察者列表
private String uperName;
// UP主的名字
private String videoName;
// 发布视频的名字public BiliUper(String uperName) {
observerList = new ArrayList<>();
this.uperName = uperName;
}@Override
public void registerObserver(Observer o) {
observerList.add(o);
// 添加观察者
}@Override
public void removeObserver(Observer o) {
observerList.remove(o);
// 移除观察者
}@Override
public void notifyObservers() {
for (Observer o: observerList) {
o.update(videoName);
// 回调观察者的方法
}
}/**
* UP主更新视频方法
* @param videoName 视频名字
*/
public void publishANewVideo(String videoName) {
this.videoName = videoName;
System.out.println(uperName + "更新了一个视频:" + videoName);
notifyObservers();
}
}
定义普通用户类,并实现观察者接口:
/**
* 普通用户
*/class User implements Observer {
private String userName;
public User(String userName) {
this.userName = userName;
}@Override
public void update(String videoName) {
System.out.println("用户" + userName + "收到了更新的视频:" + videoName);
}
}
程序主类:
/**
* 程序入口类
*/class Main {public static void main(String... args) {
BiliUper uper = new BiliUper("up主阿猪");
// 实例化一个UP主叫阿猪Observer xiaoMing = new User("小名");
// 实例化用户小名
Observer aQiang = new User("阿强");
// 实例化用户阿强
Observer huaHu = new User("花虎");
// 实例化用户花虎uper.registerObserver(xiaoMing);
// 添加观察者,接收UP主更新
uper.registerObserver(aQiang);
// 同上
uper.registerObserver(huaHu);
// 同上uper.publishANewVideo("教大家如何种草!");
// UP主阿猪发布一个新视频叫“如何种草”System.out.println("\n---过了段时间---\n");
// 模拟过了一段时间uper.removeObserver(xiaoMing);
// 移除观察者,不再接收UP主视频更新提醒
uper.removeObserver(aQiang);
// 同上uper.publishANewVideo("教大家如何除草!");
// UP主阿猪又发布了一个新视频
}}
程序运行结果:
文章图片
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- PMSJ寻平面设计师之现代(Hyundai)
- 太平之莲
- 闲杂“细雨”
- 七年之痒之后
- 深入理解Go之generate
- 由浅入深理解AOP
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 生活随笔|好天气下的意外之喜
- 感恩之旅第75天