Java設計模式:觀察者
阿新 • • 發佈:2018-12-23
簡單來說,觀察者模式=釋出者+訂閱者。
下面是一個有關獵頭的典型的例子。在下面這張圖當中有兩個角色:獵頭和尋找工作的人。找工作的人向獵頭訂閱,告知自己希望得到一份工作,當有新的工作機會的時候,獵頭就會把這個資訊通知給曾經向他訂閱過的人。
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"); } }