900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 【设计模式】之观察者模式——简单的“微信公众号推送消息给相关用户”

【设计模式】之观察者模式——简单的“微信公众号推送消息给相关用户”

时间:2023-08-13 23:40:02

相关推荐

【设计模式】之观察者模式——简单的“微信公众号推送消息给相关用户”

目录

一、简单介绍

二、观察者模式涉及的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);}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。