用Java请以发行商(Publisher)和不同类型读者(Reader))为例实现观察者(发布-订阅)模式。
时间: 2024-05-13 13:18:23 浏览: 18
观察者模式是一种行为设计模式,它允许您定义一种订阅机制,以便一些对象可以实时监视另一些对象的状态更改。在这种模式中,有两种类型的对象:主题和观察者。主题是要被监视的对象,而观察者是监视主题的对象。当主题状态发生变化时,它会通知所有的观察者,使它们可以采取适当的行动。
在我们的示例中,我们将使用发行商(Publisher)作为主题,读者(Reader)作为观察者。
首先,我们需要定义一个主题接口(Publisher):
```java
public interface Publisher {
public void attach(Reader reader);
public void detach(Reader reader);
public void notifyReaders();
}
```
该接口定义了三个方法。attach() 方法用于将一个观察者对象添加到主题的观察者列表中,detach() 方法用于从主题的观察者列表中删除一个观察者对象,notifyReaders() 方法用于通知所有观察者主题状态发生了变化。
接下来,我们需要定义一个观察者接口(Reader):
```java
public interface Reader {
public void update();
}
```
该接口只定义了一个方法 update(),当主题状态发生变化时,该方法将被调用。
然后,我们需要定义一个具体的主题类(BookPublisher):
```java
import java.util.ArrayList;
import java.util.List;
public class BookPublisher implements Publisher {
private List<Reader> readers = new ArrayList<>();
private String bookName;
public void setBookName(String bookName) {
this.bookName = bookName;
notifyReaders();
}
public void attach(Reader reader) {
readers.add(reader);
}
public void detach(Reader reader) {
readers.remove(reader);
}
public void notifyReaders() {
for (Reader reader : readers) {
reader.update();
}
}
public String getBookName() {
return bookName;
}
}
```
该类实现了 Publisher 接口,并定义了一个观察者列表 readers 和一个书名属性 bookName。当书名属性发生变化时,该类将调用 notifyReaders() 方法,通知所有的观察者。
最后,我们需要定义一个具体的观察者类(ReaderImpl):
```java
public class ReaderImpl implements Reader {
private String name;
private BookPublisher bookPublisher;
public ReaderImpl(String name, BookPublisher bookPublisher) {
this.name = name;
this.bookPublisher = bookPublisher;
}
public void update() {
System.out.println(name + " received the new book " + bookPublisher.getBookName());
}
}
```
该类实现了 Reader 接口,并定义了一个名字属性 name 和一个 BookPublisher 属性 bookPublisher。当它接收到主题的通知时,它将输出一条消息。
现在,我们可以在主函数中创建一个 BookPublisher 对象和两个 ReaderImpl 对象,然后通过 attach() 方法将这两个对象添加到 BookPublisher 的观察者列表中。然后,我们可以通过 setBookName() 方法设置书名属性,从而触发 notifyReaders() 方法,通知所有的观察者:
```java
public static void main(String[] args) {
BookPublisher bookPublisher = new BookPublisher();
ReaderImpl reader1 = new ReaderImpl("John", bookPublisher);
ReaderImpl reader2 = new ReaderImpl("Mary", bookPublisher);
bookPublisher.attach(reader1);
bookPublisher.attach(reader2);
bookPublisher.setBookName("The Lord of the Rings");
}
```
输出:
```
John received the new book The Lord of the Rings
Mary received the new book The Lord of the Rings
```
这样,我们就成功地使用 Java 实现了观察者(发布-订阅)模式。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)