目录
一、简单介绍
二、观察者模式涉及的4个角色
三、观察者模式demo:简单的“微信公众号推送消息给相关用户”
一、简单介绍
定义对象间“一对多”的依赖关系。
“一”为被观察者,“多”为观察者;当被观察者(某个微信公众号)状态变化时,观察者(订阅此公众号多诸多用户)得到通知而被自动更新。
二、观察者模式涉及的4个角色
1、抽象主题Subject
即被观察者,把所有观察者引用保存到集合,并提供接口对观察者进行增、删、通知。
2、具体主题ConcreteSubject
抽象主题Subject的实现。
3、抽象观察者Observer
提供更新接口,收到被观察者通知时 更新自己。
4、具体观察者ConcreteObserver
抽象观察者Observer的实现
三、观察者模式demo:简单的“微信公众号推送消息给相关用户”
0、简介
1、定义三个用户2、三个用户订阅公众号3、公众号消息推送给3个订阅用户4、其中一个用户取消订阅
/*** 测试微信公众号向订阅它多用户发消息* */public class ZTest {public static void main(String[] args) {//1、定义三个用户User user1 = new User("双子座撒卡");User user2 = new User("水瓶座卡妙");User user3 = new User("摩羯座修罗");//2、三个用户订阅公众号WeChat weChat = new WeChat();weChat.addObserver(user1);weChat.addObserver(user2);weChat.addObserver(user3);//3、公众号消息推送给3个订阅用户weChat.notifyObserver("快速前往圣所山域!!!");System.out.println("---------------------------------");//4、其中一个用户取消订阅weChat.delOnserver(user3);weChat.notifyObserver("摩羯座修罗-取消订阅!!!");}}
结果:
1、实现方式
1.1 定义观察者和被观察者2个接口类
/*** 被观察者(一)* 维护一个集合:保存观察者引用* 提供增、删、通知接口*/public interface Subject {void addObserver(Observer observer);void delOnserver(Observer observer);void notifyObserver(String notifyInfo);}
/*** 观察者(多)*/public interface Observer {public void update(String str);}
1.2 定义公众号实现类并重写被观察者方法
public class WeChat implements Subject{private static List<Observer> observerList;public WeChat(){observerList = new ArrayList<>();}@Overridepublic void addObserver(Observer observer) {observerList.add(observer);}@Overridepublic void delOnserver(Observer observer) {if(observerList.indexOf(observer) != -1){observerList.remove(observerList.indexOf(observer));}}@Overridepublic void notifyObserver(String notifyInfo) {observerList.forEach(s->s.update(notifyInfo));}}
1.3 定义用户实现类并重写观察者方法
@Slf4jpublic class User implements Observer {private String name;public User(String name) {this.name = name;}@Overridepublic void update(String str) {log.info("名字:{},收到微信公众号消息:{}", name, str);}}