514
阿裏雲
技術社區[雲棲]
Java設計模式:觀察者
簡單來說,觀察者模式=發布者+訂閱者。
下麵是一個有關獵頭的典型的例子。在下麵這張圖當中有兩個角色:獵頭和尋找工作的人。找工作的人向獵頭訂閱,告知自己希望得到一份工作,當有新的工作機會的時候,獵頭就會把這個信息通知給曾經向他訂閱過的人。

Java代碼
Subject接口:
1 |
public interface Subject {
|
2 |
public void registerObserver(Observer observer);
|
3 |
public void removeObserver(Observer observer);
|
4 |
public void notifyAllObservers();
|
Observer接口:
1 |
public interface Observer {
|
2 |
public void update(Subject subject);
|
HeadCounter實現了Subject接口,實際上就是發布者:
01 |
public class HeadCounter implements Subject {
|
03 |
private List<Observer> observerList;
|
04 |
private List<String> jobList;
|
07 |
observerList = new ArrayList<Observer>();
|
08 |
jobList = new ArrayList<String>();
|
12 |
public void registerObserver( final Observer observer) {
|
13 |
if (! observerList.contains(observer)){
|
14 |
observerList.add(observer);
|
19 |
public void removeObserver( final Observer observer) {
|
20 |
if (observerList.contains(observer)){
|
21 |
observerList.remove(observer);
|
26 |
public void notifyAllObservers() {
|
27 |
for (Observer observer : observerList){
|
28 |
observer.update( this );
|
32 |
public void addJob( final String job){
|
33 |
this .jobList.add(job);
|
37 |
public List<String> getJobs(){
|
41 |
public String toString(){
|
42 |
return jobList.toString();
|
JobSeeker實現了Observer接口,實際上就是訂閱者:
01 |
public class JobSeeker implements Observer {
|
04 |
public JobSeeker(String name){
|
09 |
public void update(Subject subject) {
|
10 |
System.out.println( this .name + " got notified!" );
|
11 |
System.out.println(subject);
|
程序實例入口:
02 |
public static void main(String[] args) {
|
03 |
HeadCounter headCounter = new HeadCounter();
|
05 |
headCounter.registerObserver( new JobSeeker( "Mike" ));
|
06 |
headCounter.registerObserver( new JobSeeker( "Chris" ));
|
07 |
headCounter.registerObserver( new JobSeeker( "Jeff" ));
|
09 |
headCounter.addJob( "Google Job" );
|
10 |
headCounter.addJob( "Yahoo Job" );
|
最後更新:2017-05-23 17:03:48