观察者模式
UML
![观察者模式](https://i-blog.csdnimg.cn/blog_migrate/f349abfb1fd8b69a05c3a170dc7187ce.png)
解释说明
- 观察者模式:定义了一种一对多的依赖关系,让多个观察者对象(Observer)同时监听某一个主题对象(Subject)。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
- 观察者模式又称为 发布-订阅(Publish/Subscribe)模式。
- 观察者模式的事实是解耦,让耦合的双方依赖于抽象而非具体。
代码实现
package learn10;
public abstract class Observer {
public abstract void update();
}
package learn10;
import java.util.ArrayList;
import java.util.List;
public abstract class Subject {
private List<Observer> observers = new ArrayList<>();
public void attach(Observer observer) {
observers.add(observer);
}
public void detach(Observer observer) {
observers.remove(observer);
}
public void Notify() {
for (Observer o : observers) {
o.update();
}
}
}
package learn10;
public class ConcreteSubject extends Subject {
private String subjectState;
public String getSubjectState() {
return subjectState;
}
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
}
}
package learn10;
public class ConcreteObserver extends Observer {
private String name;
private String observerState;
private ConcreteSubject subject;
public ConcreteObserver(String name, ConcreteSubject subject) {
this.name = name;
this.subject = subject;
}
@Override
public void update() {
observerState = subject.getSubjectState();
System.out.println(String.format("观察者 %s 的状态是: %s", name, observerState));
}
}
import learn10.*;
public class Main {
public static void main(String[] args) {
ConcreteSubject s = new ConcreteSubject();
ConcreteObserver o1 = new ConcreteObserver("No.1", s);
ConcreteObserver o2 = new ConcreteObserver("No.2", s);
s.attach(o1);
s.attach(o2);
s.setSubjectState("X");
s.Notify();
}
}
参考资料