Skip to content

Commit

Permalink
Update 12 观察者模式.md
Browse files Browse the repository at this point in the history
  • Loading branch information
Q10Viking committed Mar 27, 2024
1 parent 98f0860 commit 7781080
Showing 1 changed file with 198 additions and 0 deletions.
198 changes: 198 additions & 0 deletions docs/designpattern/12 观察者模式.md
Original file line number Diff line number Diff line change
Expand Up @@ -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<IRss> 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<IRss> 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);

/**
* <p>一旦调用该方法,所有依赖于csdn系统的消息订阅者都将收到变更的消息</p>
*/
@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
/**
* <p>消息订阅接口,提供一个订阅消息内容的实现</p>
*/
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
*/
```

0 comments on commit 7781080

Please sign in to comment.