1. 程式人生 > >Java設計模式:觀察者

Java設計模式:觀察者

原文連結 譯者:秦建平

簡單來說,觀察者模式=釋出者+訂閱者。

下面是一個有關獵頭的典型的例子。在下面這張圖當中有兩個角色:獵頭和尋找工作的人。找工作的人向獵頭訂閱,告知自己希望得到一份工作,當有新的工作機會的時候,獵頭就會把這個資訊通知給曾經向他訂閱過的人。

observer-pattern

Java程式碼
Subject介面:

public interface Subject {
	public void registerObserver(Observer observer);
	public void removeObserver(Observer observer);
	public void notifyAllObservers();
}

Observer介面:

public interface Observer {
	public void update(Subject subject);
}

HeadCounter實現了Subject介面,實際上就是釋出者:

public class HeadCounter implements Subject {

	private List<Observer> observerList;
	private List<String> jobList;

	public HeadCounter(){
		observerList = new ArrayList<Observer>();
		jobList = new ArrayList<String>();
	}

	@Override
	public void registerObserver(final Observer observer) {
		if(! observerList.contains(observer)){
			observerList.add(observer);
		}
	}

	@Override
	public void removeObserver(final Observer observer) {
		if(observerList.contains(observer)){
			observerList.remove(observer);
		}
	}

	@Override
	public void notifyAllObservers() {
		for(Observer observer : observerList){
			observer.update(this);
		}
	}

	public void addJob(final String job){
		this.jobList.add(job);
		notifyAllObservers();
	}

	public List<String> getJobs(){
		return jobList;
	}

	public String toString(){
		return jobList.toString();
	}

JobSeeker實現了Observer介面,實際上就是訂閱者:

public class JobSeeker implements Observer {
	private String name;

	public JobSeeker(String name){
		this.name = name;
	}

	@Override
	public void update(Subject subject) {
		System.out.println(this.name + " got notified!");
		System.out.println(subject);
	}
}

程式例項入口:

public class Main {
	public static void main(String[] args) {
		HeadCounter headCounter = new HeadCounter();
                //註冊訂閱者
		headCounter.registerObserver(new JobSeeker("Mike"));
		headCounter.registerObserver(new JobSeeker("Chris"));
		headCounter.registerObserver(new JobSeeker("Jeff"));
		//通知所有訂閱者有新的工作機會
		headCounter.addJob("Google Job");
		headCounter.addJob("Yahoo Job");
	}
}


秦建平

專注於Android、Java、效能優化,《Android程式設計寶典》作者,嚮往自由,為目標前行