觀察者模式:對象之間多對一依賴的一種設計方案,被依賴的對象爲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");