一、基本介绍
观察者模式:对象之间多对一的一种设计方案,一的一方是被依赖的对象称为Subject,多的一方是依赖的对象称为Observer,Subject通知Observer变化。比如气象局是Subject,为一的一方,第三方网站是Observer,为多的一方。
二、代码实现
(1)创建Subject接口及其抽象类
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObservers();
}
public class SubjectImpl implements Subject {
private String message;
//观察者集合
private ArrayList<Observer> observers;
public SubjectImpl() {
observers = new ArrayList<Observer>();
}
public String getMessage() {
return message;
}
public void dataChange() {
notifyObservers();
}
//当数据有更新时,就调用 setData
public void setMessage(String message) {
this.message = message;
dataChange();
}
//注册一个观察者
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
//移除一个观察者
@Override
public void removeObserver(Observer observer) {
if(observers.contains(observer)) {
observers.remove(observer);
}
}
//遍历并通知所有的观察者
@Override
public void notifyObservers() {
for(int i = 0; i < observers.size(); i++) {
observers.get(i).update(this.message);
}
}
}
(2)创建观察者及其实现类
public interface Observer {
public void update(String message);
}
public class ObserverOne implements Observer {
private String message;
// 更新消息
public void update(String message) {
this.message = message;
display();
}
public void display() {
System.out.println("ObserverOne");
System.out.println("\t新消息 : " + message);
}
}
public class ObserverTwo implements Observer {
private String message;
// 更新消息
public void update(String message) {
this.message = message;
display();
}
public void display() {
System.out.println("ObserverTwo");
System.out.println("\t新消息 : " + message);
}
}
(3)测试
public class Client {
public static void main(String[] args) {
SubjectImpl subject = new SubjectImpl();
//创建观察者
Observer observerOne = new ObserverOne();
Observer observerTwo = new ObserverTwo();
//注册到subject
subject.registerObserver(observerOne);
subject.registerObserver(observerTwo);
//测试
System.out.println("通知观察者, 查看信息");
subject.setMessage("天干物燥");
subject.removeObserver(observerTwo);
System.out.println("通知观察者, 查看信息");
subject.setMessage("小心火烛");
}
}
三、UML类图
四、观察者模式小结
- 观察者模式设计后,会以集合的方式来管理用户(Observer),包括注册,移除和通知。
- 这样,我们增加观察者(这里可以理解成一个新的公告板),就不需要去修改核心类WeatherData不会修改代码,遵守了ocp原则。