观察者模式是Java编程中的设计模式之一。观察者模式是一种对象行为模式,它被用来创建类似于事件处理系统的设计。本文将从多个角度分析Java观察者模式代码。
一、 观察者模式定义
观察者模式(Observer Pattern)又称为发布订阅模式(Publish/Subscribe),属于行为模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生改变时,会通知所有观察者,使它们能够自动更新自己。
二、 观察者模式的组成部分
1. 抽象被观察者(Subject):抽象被观察者角色把所有观察者对象的引用保存在一个集合里,每个被观察者都可以有任意数量的观察者。抽象被观察者提供了增加观察者、删除观察者、通知观察者等方法。
2. 抽象观察者(Observer):抽象观察者角色是一个抽象类或接口,它只有一个更新的方法,当被观察者调用该方法时,观察者将被通知。
3. 具体被观察者(ConcreteSubject):具体被观察者角色是实现抽象被观察者角色的具体类,它必须实现抽象被观察者角色所定义的接口。
4. 具体观察者(ConcreteObserver):具体观察者角色是实现抽象观察者角色的具体类,它必须实现抽象观察者角色所定义的接口,并实现更新方法。
三、 观察者模式的代码实现
以下是一个简单的Java实现观察者模式的代码:
让我们来解释这个代码,首先我们有一个主题(Subject),它是一个接口,有着添加、删除和通知观察者的方法。
```java
interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
```
然后我们有一个具体的主题(ConcreteSubject)类,它继承了主题接口,同时添加了一个数据字段和一组观察者,当数据改变时,它会通知所有的观察者。
```java
class ConcreteSubject implements Subject {
private List
private int data;
public void registerObserver(Observer o) {
observers.add(o);
}
public void removeObserver(Observer o) {
observers.remove(o);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(data);
}
}
public void setData(int data) {
this.data = data;
notifyObservers();
}
}
```
现在我们有一个观察者(Observer)接口,它只有一个更新方法。
```java
interface Observer {
public void update(int data);
}
```
最后,我们有一个具体的观察者(ConcreteObserver)类实现了观察者接口,并通过主题注册了自己。
```java
class ConcreteObserver implements Observer {
private Subject subject;
public ConcreteObserver(Subject subject) {
this.subject = subject;
subject.registerObserver(this);
}
public void update(int data) {
System.out.println("Data has been changed to " + data);
}
}
```
四、 实现观察者模式的优缺点
1. 优点
(1) 降低耦合度:被观察者和观察者之间是松散耦合的,它们之间并不依赖彼此。当被观察者发生改变的时候,只需要通知观察者即可。
(2) 符合开闭原则:可以在不修改代码的情况下增加新的观察者。
(3) 非常适合需要事件处理的系统。
2. 缺点
(1) 观察者模式可能有过多的广播:如果观察者非常多,并且观察者之间有复杂的依赖关系,则会导致广播过程非常复杂。
(2) 观察者需要避免循环引用:在观察者之间存在循环引用时,很容易导致系统崩溃或重复发送通知。
五、 总结
在Java编程中,观察者模式是一种非常有用的设计模式。它通过主题和观察者之间的分离来提高代码的可维护性和可扩展性,使系统更有弹性。具体而言,观察者模式可以将系统的关注点转移到事件本身上,以便实现更好的事件驱动架构。
扫码咨询 领取资料