观察者模式:如果对象之间存在一对多关系,当一个对象改变状态,依赖它的多个对象会收到通知并更新自己。
自己实现:
被观察者:抽象主题+具体主题
/**
* 抽象主题接口(被观察者)
*/
public interface Subject {
// 增加观察者
void addObserver(Observer observer);
// 删除观察者
void deleteObserver(Observer observer);
// 通知所有观察者
void notifyObservers(String content);
}
/**
* 具体实现类
*/
public class ConcreteSubject implements Subject {
// 观察者列表
private List<Observer> observers = new ArrayList<>();
@Override
public void addObserver(Observer observer) {
observers.add(observer);
}
@Override
public void deleteObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(String content) {
for (Observer observer : observers) {
observer.update(content);
}
}
}
观察者:抽象观察者+具体观察者
/**
* 抽象观察者
*/
public interface Observer {
// 收到通知后,更新自己
void update(String content);
}
/**
* 具体实现类
*/
public class ConcreteObserver implements Observer {
@Override
public void update(String content) {
System.out.println(content);
}
}
使用:
public class Main {
public static void main(String[] args) {
// 创建一个被观察者
ConcreteSubject subject = new ConcreteSubject();
// 创建三个观察者
ConcreteObserver observer1 = new ConcreteObserver();
ConcreteObserver observer2 = new ConcreteObserver();
ConcreteObserver observer3 = new ConcreteObserver();
// 被观察者添加观察者
subject.addObserver(observer1);
subject.addObserver(observer2);
subject.addObserver(observer3);
// 被观察者通知观察者
subject.notifyObservers("哈哈哈哈");
// 移除一个观察者
subject.deleteObserver(observer2);
subject.notifyObservers("哈哈哈哈咯");
}
}
JDK内置的支持:
被观察者:继承Observable类
public class CSubject extends Observable {
// 必须内部调用setChanged()才正在的能通知到观察者,否则即使调用notifyObservers()也无用
void change() {
super.setChanged();
}
}
观察者:实现Observer接口
public class CObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println(arg);
}
}
使用:
public class TMain {
public static void main(String[] args) {
CSubject subject = new CSubject();
CObserver cObserver1 = new CObserver();
CObserver cObserver2 = new CObserver();
CObserver cObserver3 = new CObserver();
subject.addObserver(cObserver1);
subject.addObserver(cObserver2);
subject.addObserver(cObserver3);
subject.change();
subject.notifyObservers("123");
}
}