1个被观察者,多个观察者,直接代码来说明 // TODO 抽象层 被观察者 public interface Observable { // 关注 void addObserver(Observer observer); // 取消关注 void removeObserver(Observer observer); // 被观察者发出了改变 void notifyObservers(); // 微信公众号的服务 编辑部门 发布一条消息 void pushMessage(String message); }
2// TODO 抽象层 观察者 public interface Observer { // 被观察者改变了,我这里可以知道 void update(Object value); }
3// 观察者 实现 public class UserPerson implements Observer { private String name; private String message; public UserPerson(String name) { this.name = name; } @Override public void update(Object value) { this.message = (String) value; // 读取消息 readMessage(); } private void readMessage() { System.out.println(name + " 收到了推送消息:" + message); } }
// 被观察者 实现 public class WechatServerObservable implements Observable { // 容器 存储 多个 观察者 private List<Observer> observers = new ArrayList<>(); private String message; @Override public void addObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObservers() { // 遍历容器 for (Observer observer : observers) { observer.update(message); } } @Override public void pushMessage(String message) { this.message = message; // System.out.println("微信服务号更新了消息:" + message); // 通知所有 关注了 此服务号的 用户 notifyObservers(); } }
使用
public static void test() { // 编辑部 编辑好的文案内容 String msg = "重大消息:以后Android程序员必须要学习Kotlin,必须要学习各种新技术与跨平台的内容啦"; // 创建一个微信公众号服务(被观察者) Observable server = new WechatServerObservable(); // 创建 用户 (观察者) 多个 Observer shizhenxiangUser = new UserPerson("史"); Observer duzitenUser = new UserPerson("杜"); Observer daiyuejinUser = new UserPerson("戴"); Observer liumangUser = new UserPerson("刘"); // 订阅 注意:这里的订阅还是 被观察者.订阅(观察者) 关注 server.addObserver(shizhenxiangUser); server.addObserver(duzitenUser); server.addObserver(daiyuejinUser); server.addObserver(liumangUser); // 微信平台 发生了 改变 // server.pushMessage(msg); // 肚子疼 取消了关注 System.out.println("============================================"); server.removeObserver(duzitenUser); // 再次微信平台 发生了 改变 server.pushMessage(msg); }