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设计模式之观察者模式(简单介绍加代码小例子)
文章图片

    推荐阅读