观察者模式
以微信服务号和订阅用户为例,来演示观察者模式实现
- 微信服务号对应着主题Subject,就是被观察者。
- 我们可以抽象出来接口,有三个功能,注册订阅用户,移除用户,推送消息
- 订阅用户抽象出来接口Observer,每次Subject推送消息时候,都能收到并且更新
- 最后进行测试。
下面是对应具体代码:
- 实现Suject接口
-
package com.binfoo.observer; /** * 关注公众号的接口,提供三个功能 */ public interface Subject { /** * 注册粉丝 * @param observer */ void registerObserver(Observer observer); /** * 移除粉丝 * @param observer */ void removeObserver(Observer observer); /** * 主题推送给所有粉丝 */ void notifyObservers(); }
- 实现用户Observer接口
-
package com.binfoo.observer; /** * 所有的观察者需要实现此接口 */ public interface Observer { void update(String msg); }
- 具体的主题订阅SoftLearningSuject类
-
package com.binfoo.observer; import java.util.ArrayList; import java.util.List; /** * 软件学习公众号主题,实现Subject接口 */ public class SoftLearningSubject implements Subject{ private List<Observer> observerList = new ArrayList<>(); private String msg; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; notifyObservers(); } @Override public void registerObserver(Observer observer) { observerList.add(observer); } @Override public void removeObserver(Observer observer) { observerList.remove(observer); } @Override public void notifyObservers() { for (Observer o:observerList){ o.update(msg); } } }
- 具体的订阅用户UserObserver类
-
package com.binfoo.observer; /** * 用户实现观察者接口 */ public class UserObserver implements Observer{ private SoftLearningSubject subject; public UserObserver(String name,SoftLearningSubject subject){ this.name = name; subject.registerObserver(this); } private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void update(String msg) { System.out.println("用户: " + name + " 收到推送信息: " + msg); } }
- 测试代码
-
package com.binfoo.observer; public class Test { public static void main(String[] args) { //1. 创建公众号主题 //2. 创建三个订阅用户,并且注册到公众号主题 //3. 公众号推送消息,查看订阅用户收到公众号消息 SoftLearningSubject subject = new SoftLearningSubject(); UserObserver u1 = new UserObserver("张三",subject); UserObserver u2 = new UserObserver("李四",subject); UserObserver u3 = new UserObserver("王五",subject); subject.setMsg("SpringBoot 入门"); } }
- 最后观察到控制台
-
用户: 张三 收到推送信息: SpringBoot 入门 用户: 李四 收到推送信息: SpringBoot 入门 用户: 王五 收到推送信息: SpringBoot 入门