JAVA请以发行商(Publisher)和不同类型读者(Reader)为例实现观察者(发布-订阅)模式。
时间: 2024-05-06 20:17:43 浏览: 9
观察者模式是一种行为设计模式,它允许对象在特定事件发生时通知其他对象。在该模式中,有两种重要的角色,分别是发布者(Publisher)和订阅者(Subscriber)。
在JAVA中,可以使用Java内置的Observer和Observable类来实现观察者模式。
首先,我们需要定义一个Publisher类,它将维护所有的订阅者,并在状态改变时通知它们。代码如下:
```
import java.util.*;
public class Publisher extends Observable {
private String state;
public void setState(String state) {
this.state = state;
setChanged();
notifyObservers(state);
}
public String getState() {
return state;
}
}
```
在这个类中,我们使用了Java内置的Observable类,它提供了添加和删除观察者的方法,并在状态改变时通知它们的功能。
接下来,我们需要定义一个Reader接口,它将作为订阅者的抽象。代码如下:
```
public interface Reader {
void update(String state);
}
```
这个接口中只有一个update方法,它将在Publisher状态改变时被调用。
最后,我们需要定义几个具体的Reader类,它们将实现Reader接口并在状态改变时做出相应的反应。代码如下:
```
public class TypeAReader implements Reader {
@Override
public void update(String state) {
System.out.println("Type A Reader received new state: " + state);
}
}
public class TypeBReader implements Reader {
@Override
public void update(String state) {
System.out.println("Type B Reader received new state: " + state);
}
}
```
现在,我们可以使用这些类来实现观察者模式了。下面是一个示例程序:
```
public class ObserverPatternDemo {
public static void main(String[] args) {
Publisher publisher = new Publisher();
TypeAReader readerA = new TypeAReader();
TypeBReader readerB = new TypeBReader();
publisher.addObserver(readerA);
publisher.addObserver(readerB);
publisher.setState("new state");
}
}
```
在这个程序中,我们首先创建了一个Publisher对象,并创建了两个具体的Reader对象。接着,我们将这些Reader对象添加到Publisher的观察者列表中。最后,我们改变Publisher的状态,并期望所有的订阅者都能够收到通知。
输出结果如下:
```
Type A Reader received new state: new state
Type B Reader received new state: new state
```
可以看到,两个不同类型的Reader都收到了相同的通知。这就是观察者模式的魅力所在:发布者和订阅者之间的松耦合关系,以及能够轻松地添加和删除订阅者。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.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)