观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化。
观察者模式包含四个角色:抽象主题(Subject)、具体主题、抽象观察者(Observer)、具体观察者
观察者模式的实现
我们创建一个彩票的主题,以购彩者作为观察者,向彩票主题进行注册,而彩票主题则向购彩者进行通知,来实现观察者模式。
下面是一个抽象主题,包含注册观察者、取消观察者以及通知观察者的方法。
public interface Subject {
//注册观察者
public void registObserver(Observer observer);
//取消观察者
public void removeObserver(Observer observer);
//通知观察者
public void notifyObserver();
}
我们需要一个抽象观察者,包含获得消息的方法
public interface Observer {
//观察者获得消息
public void update(String msg);
}
接下来我们编写具体主题类,其中包含一个集合,用于存储注册的观察者对象,当我们要发送消息,主题就会遍历其集合中所存储的所有观察者对象,调用观察者获得消息的方法,发送消息。
public class Sport3DSubject implements Subject {
//定义一个集合,存储观察者的对象
private List<Observer> observers = new ArrayList<>();
//消息
private String msg;
//给主题设置要发送的消息
public void setMsg(String msg) {
this.msg = msg;
//设置完消息通知观察者
notifyObserver();
}
public void registObserver(Observer observer) {
//添加观察者
observers.add(observer);
}
public void removeObserver(Observer observer) {
//校验这个观察者是否在集合中
int index = observers.indexOf(observer);
if (index >= 0) {
observers.remove(observer);
}
}
public void notifyObserver() {
//遍历观察者,逐个发消息
for (Observer observer : observers) {
observer.update(msg);
}
}
}
对观察者模式进行测试
//主题对象
Sport3DSubject subject = new Sport3DSubject();
//创建观察者,并注册
ObserverPerson observer = new ObserverPerson(subject);
ObserverPerson observer2 = new ObserverPerson(subject);
ObserverPerson observer3 = new ObserverPerson(subject);
//通知
subject.setMsg("开奖号码为1");