設計模式之觀察者模式

觀察者模式:對象之間多對一依賴的一種設計方案,被依賴的對象爲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");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章