From 7781080df5e3e8960b067941ab4b4cbb28de1931 Mon Sep 17 00:00:00 2001 From: Q10Viking <1193094618@qq.com> Date: Wed, 27 Mar 2024 18:02:33 +0800 Subject: [PATCH] =?UTF-8?q?Update=2012=20=E8=A7=82=E5=AF=9F=E8=80=85?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...37\350\200\205\346\250\241\345\274\217.md" | 198 ++++++++++++++++++ 1 file changed, 198 insertions(+) diff --git "a/docs/designpattern/12 \350\247\202\345\257\237\350\200\205\346\250\241\345\274\217.md" "b/docs/designpattern/12 \350\247\202\345\257\237\350\200\205\346\250\241\345\274\217.md" index d8f3c4dcf6c..87766452ac5 100644 --- "a/docs/designpattern/12 \350\247\202\345\257\237\350\200\205\346\250\241\345\274\217.md" +++ "b/docs/designpattern/12 \350\247\202\345\257\237\350\200\205\346\250\241\345\274\217.md" @@ -438,3 +438,201 @@ public class TestDemo { */ ``` + + +### RRS消息订阅 + +[Source Code](https://gitee.com/q10viking/design-patterns/tree/master/springboot-design-patterns/src/main/java/org/hzz/%E8%A1%8C%E4%B8%BA%E6%80%A7%E6%A8%A1%E5%BC%8F/BP1_%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F/%E6%A1%88%E4%BE%8B/RRS%E6%B6%88%E6%81%AF%E8%AE%A2%E9%98%85) + +#### 主题中心 + +定义一系列操作行为 + +```java +/** + * 消息订阅者操作接口 + */ +public interface IRsserOperate { + // 增加一个订阅者 + void add(IRss rss); + + // 移除一个订阅者 + void del(IRss rss); + + // 根据订阅者的ID移除一个订阅者 + void remove(Long rssID); + + // 通知所有订阅者,订阅的内容是什么 + void notifyRssers(String content); + + // 发布消息 + void publish(String content); +} +``` + +抽象主题类 + +```java +/** + * 抽象一个订阅类,实现rss操作 + */ +public abstract class AbstractSubscription implements IRsserOperate { + + /** + * 存放不同的消息订阅对象(一个消息订阅对象对应一个消息消费者) + */ + protected List rsses = new ArrayList<>(); + + @Override + public void add(IRss rss) { + this.rsses.add(rss); + } + + @Override + public void del(IRss rss) { + this.rsses.remove(rss); + } + + /** + * 移除消息订阅方 + * + * @param rssId 消息订阅消费者ID + */ + @Override + public void remove(Long rssId) { + Iterator iterator = rsses.iterator(); + while (iterator.hasNext()) { + RssUser next = (RssUser) iterator.next(); + if (rssId.equals(next.getId())) { + iterator.remove(); + break; + } + } + } + + /** + * 将消息通知到所有的订阅者 + * + * @param content 消息内容 + */ + @Override + public void notifyRssers(String content) { + for (IRss rss : rsses) { + // 循环调用 + rss.rss(content); + } + } +} +``` + +具体实现 + +```java +package org.hzz.行为性模式.BP1_观察者模式.案例.RRS消息订阅.impl; + +import org.hzz.行为性模式.BP1_观察者模式.案例.RRS消息订阅.AbstractSubscription; +import org.hzz.行为性模式.BP1_观察者模式.案例.RRS消息订阅.IRss; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class CsdnSystem extends AbstractSubscription { + private ExecutorService executor = + Executors.newFixedThreadPool(10); + + /** + *

一旦调用该方法,所有依赖于csdn系统的消息订阅者都将收到变更的消息

+ */ + @Override + public void publish(String content) { + System.out.println(content); + CsdnSystem.this.notifyRssers(content); + } + + // 使用自己的通知,采用线程池 + @Override + public void notifyRssers(String content) { + for (IRss user : this.rsses) { + executor.submit(() -> user.rss(content)); + } + } +} + +``` + +#### 观察者Rss订阅的用户 + +```java +/** + *

消息订阅接口,提供一个订阅消息内容的实现

+ */ +public interface IRss { + + /** + * 消息订阅,主要输出订阅的内容 + */ + void rss(String content); + +} +``` + +具体实现 + +```java +/** + * 消息订阅消费者 + */ +public class RssUser implements IRss { + /** + * 用户ID + */ + private Long id; + + /** + * 用户名称 + */ + private String name; + + public RssUser(Long id, String name) { + this.id = id; + this.name = name; + } + + @Override + public void rss(String content) { + System.out.println("尊敬的用户( id = " + this.id + ",name = " + this.name + "),你搜到了一条订阅消息:" + content); + } + + public Long getId() { + return id; + } +} +``` + + + +#### 测试 + +```java +public class TestDemo { + public static void main(String[] args) { + String content = "官方通知:CSDN版本升级,维护时间到" + LocalDateTime.now().plusHours(6); + CsdnSystem csdnSystem = new CsdnSystem(); + + RssUser[] users = new RssUser[]{ + new RssUser(1000L,"hzz"), + new RssUser(1001L,"love"), + new RssUser(1002L,"java") + }; + Stream.of(users).forEach( user -> csdnSystem.add(user)); + csdnSystem.publish(content); + } +} +/** + * 官方通知:CSDN版本升级,维护时间到2024-03-27T23:57:53.933 + * 尊敬的用户( id = 1000,name = hzz),你搜到了一条订阅消息:官方通知:CSDN版本升级,维护时间到2024-03-27T23:57:53.933 + * 尊敬的用户( id = 1002,name = java),你搜到了一条订阅消息:官方通知:CSDN版本升级,维护时间到2024-03-27T23:57:53.933 + * 尊敬的用户( id = 1001,name = love),你搜到了一条订阅消息:官方通知:CSDN版本升级,维护时间到2024-03-27T23:57:53.933 + */ +``` +