我工作的那點事--學習《設計模式》例項應用(Observer模式)

biqing0427發表於2007-12-03

今天早上一到公司,看到公司人事群發過來的郵件,通知下午開會,現在人事也比較方便的,利用現代科技,不用一個個當面通知了,記得以前小時候上學當大隊長那會,假如有什麼活動,還寫在小黑板上呢,有時候還要一個個當面通知,非常麻煩的,大人們都擔心耽誤我的學習,不讓參加這些活動,赫赫,現在看來完全沒有這個必要的。

這段時間學習設計模式,這個方式一下子讓我想起了 Observer 模式,這個模式太明顯了,說白了,就是一個人有什麼變化訊息,自動通知其他人。

[@more@]

從這個例子中,可以看出 人事就是 Observable,同事就是各個Observer了。

Java的JDK中有對這個模式的封裝,不過個人覺得為了深刻理解,自己寫了個。

1。人事
//定義介面
public interface Observable {

public void registerObserver(Object object);

public void removeObserver(Object object);

public void notifyObservers();

public void setInfo(String info);

public String getInfo();
}

public class HRObservable implements Subject {
List list = new ArrayList();
String info = "";

//為了讓新員工註冊
public void registerObserver(Object object){
list.add(object);
};

//如果有員工離職了,一定要記得把他從名單中刪掉啊
//不然他還是可以得到公司的一些資訊的
public void removeObserver(Object object){
int i = list.indexOf(object);
if(i>=0){
list.remove(i);
}
};

//有什麼事情在這裡通知了
public void notifyObservers(){
for(int i=0;i Observer observer = (Observer)list.get(i);
observer.upData(info);
}

};

//設定通知資訊
public void setInfo(String info){
this.info = info;
notifyObservers();
};

//假如員工沒有收到,自己也可以到hr處獲得相關資訊
public String getInfo(){
return info;
};
}

2.員工

public interface Observer {
public void upData(String info);
}

//員工one,這裡相當於有個接受的介面,相當於信箱之類的。
public class FellowOne implements Observer {

public void upData(String info){
System.out.println("now FellowOne gets a message from HR:"+info);
};
}

//員工Two,這裡相當於有個接受的介面,相當於信箱之類的。
public class FellowTwo implements Observer {

public void upData(String info){
System.out.println("now FellowTwo gets a message from HR:"+info);
};
}


3.一切都準備好了,下面看看我們的HR怎麼通知開會的吧:

public void testMyObserver() {

Subject subject = new HRSubject();
Observer one = new FellowOne();
Observer two = new FellowTwo();

subject.registerObserver(one);//員工one註冊
subject.registerObserver(two);//員工two註冊

subject.setInfo("now having a meeting");//通知開會了

//如果有人離職了,怎麼辦呢

System.out.println("fellowOne has lefe");

subject.removeObserver(one);

subject.setInfo("now having a meeting talk about FellowOne leaving");

}

5.看看結果吧:

now FellowOne gets a message from HR:now having a meeting
now FellowTwo gets a message from HR:now having a meeting
fellowOne has lefe
now FellowTwo gets a message from HR:now having a meeting talk about FellowOne leaving

果然FellowOne得不到資訊了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9879276/viewspace-987662/,如需轉載,請註明出處,否則將追究法律責任。

相關文章