您好,登录后才能下订单哦!
观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。在Java中,观察者模式可以通过java.util.Observer
接口和java.util.Observable
类来实现,但更常见的是使用Java的内置库java.beans
中的PropertyChangeListener
和PropertyChangeSupport
,或者使用第三方库如Spring的ApplicationListener
。
以下是使用PropertyChangeListener
和PropertyChangeSupport
实现观察者模式的步骤:
首先,定义一个观察者接口,该接口包含一个方法,用于在主题状态改变时接收通知。
public interface Observer {
void update(PropertyChangeEvent evt);
}
定义一个主题接口,该接口包含注册、移除和通知观察者的方法。
public interface Subject {
void registerObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers(PropertyChangeEvent evt);
}
实现主题接口,并使用PropertyChangeSupport
来管理观察者。
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
public class ConcreteSubject implements Subject {
private PropertyChangeSupport support;
public ConcreteSubject() {
support = new PropertyChangeSupport(this);
}
@Override
public void registerObserver(Observer o) {
support.addPropertyChangeListener((PropertyChangeEvent evt) -> o.update(evt));
}
@Override
public void removeObserver(Observer o) {
support.removePropertyChangeListener((PropertyChangeEvent evt) -> o.update(evt));
}
@Override
public void notifyObservers(PropertyChangeEvent evt) {
support.firePropertyChange(evt);
}
public void changeState(String propertyName, Object oldValue, Object newValue) {
PropertyChangeEvent evt = new PropertyChangeEvent(this, propertyName, oldValue, newValue);
notifyObservers(evt);
}
}
实现观察者接口,并在update
方法中处理状态改变的通知。
public class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(PropertyChangeEvent evt) {
System.out.println(name + " received update: " + evt.getPropertyName() + " from " + evt.getSource());
}
}
创建主题和观察者对象,并将观察者注册到主题中。
public class ObserverPatternDemo {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
Observer observer1 = new ConcreteObserver("Observer 1");
Observer observer2 = new ConcreteObserver("Observer 2");
subject.registerObserver(observer1);
subject.registerObserver(observer2);
subject.changeState("state1", null, "new value");
subject.removeObserver(observer1);
subject.changeState("state2", "new value", "another value");
}
}
通过上述步骤,我们实现了一个简单的观察者模式。主题类ConcreteSubject
管理观察者列表,并在状态改变时通知所有注册的观察者。观察者类ConcreteObserver
实现了Observer
接口,并在接收到通知时执行相应的操作。
这种实现方式利用了Java的内置库,简化了观察者模式的实现过程。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。