设计模式——观察者模式——初步
一.概念
观察者模式有时也被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
二.用于解决的问题
讲一个系统分割成一个,一些类相互协作,以完成系统功能时,有一个缺陷。那就是需要维护相关对象的一致性。我们不希望为了维持一致性而使得各个类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者模式就是解决这类的耦合关系。
三、模式中的角色
1.抽象主题(Subject)
它把所有观察者对象的引用保存到一个集合里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口可以增加和删除观察者对象。
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 notifyObserver() {
for (Observer o:observers) {
o.update();
}
}
}
2.具体主题(ConcreteSubject)
将有关状态存入具体主题对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
public class ConcreteSubject extends Subject{
private String subjectState;
public String getSubjectState() {
return subjectState;
}
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
}
}
3.抽象观察者(Observer)
为所有具体观察者,定义一个接口,在得到主题通知是更新自己。
public abstract class Observer {
public abstract void update();
}
4.具体观察者(ConcreteObserver)
实现抽象观察者角色所要求的更新接口,以便使得本身的状态与主题状态协调。
public class ConcreteObserver extends Observer{
private String observerState;
private String name;
private ConcreteSubject subject;
public ConcreteObserver(String name, ConcreteSubject subject) {
super();
this.name = name;
this.subject = subject;
}
public ConcreteSubject getSubject() {
return subject;
}
public void setSubject(ConcreteSubject subject) {
this.subject = subject;
}
@Override
public void update() {
// TODO Auto-generated method stub
observerState=subject.getSubjectState();
System.out.println("The observer's state of"+name+"is"+observerState);
}
}
四、观察者模式测试执行
1.测试代码
public class Program {
//
public static void main(String[] args) {
ConcreteSubject subject=new ConcreteSubject();
subject.attach(new ConcreteObserver("Observer A", subject));
subject.attach(new ConcreteObserver("Observer B",subject));
subject.attach(new ConcreteObserver("Observer C", subject));
subject.setSubjectState("Ready");
subject.notifyObserver();
}
}
2.运行结果
The observer's state ofObserver A isReady
The observer's state ofObserver B isReady
The observer's state ofObserver C isReady
The observer's state ofObserver B isReady
The observer's state ofObserver C isReady