設計模式之觀察者模式(Observer)

  話說2012年某某公司效益不是很好,沒有按時給員工漲工資,很多有實力的員工都想着自己的付出和收穫不成比例了,所以想跳槽,因爲他們心裏一直都有個陰影,因爲公司效益好的時候他們也沒見到太多的油水。公司高層認爲員工應該跟公司共苦,但是員工認爲 公司效益不好的時候我可以少拿錢,甚至不拿錢,但是公司效益好的時候是不是考慮多給我們一些,高層吃肉讓我們喝點湯也是那麼回事吧,但是事與願違...言歸正傳 公司高層想在週末開一個員工動員大會,理論上想讓公司員工都參加的,但是由於佔用的是休息時間所以採取自願形式,即員工想參加就可以參加員工不想參加也沒關係,參加不參加員工自己說的算,但是大部分員工還是都對公司抱有希望的,想聽一下公司給的解釋,這就涉及到了一個設計模式 觀察者模式(發佈/訂閱模式);

  觀察者模式表述的是一個一對多關係,一表示被觀察的 多表示所有觀察者 在上面的案例中 公司的高層就是被觀察這如CEO,公司的這幫員工(蝦米、小兵)就是觀察者,所有員工可以自己選擇是否參加這次忽悠大會,也可以決定中途能不能離場。而CEO要做的是把自己的忽悠思想(畫大餅)慣出給所有還留下來聽他忽悠的“蝦米”。綜上表述,CEO應該持有很多個蝦米的引用,因爲他要灌輸給他們謬論。而蝦米們也應該持有高層的引用,因爲他們自己能決定對高層的忽悠是否接受,不接受就撤了,接受就聽着,這就涉及到了觀察者能將自己註冊到被觀察者中,也能從被觀察者把自己移除。類圖如下:

 

代碼簡介如下:

 

import java.util.ArrayList;

 

public interface 公司高層 {

//ArrayList<Observer> observerList = new ArrayList<Observer>();

public void add(Observer observer);

public void del(Observer observer);

public void notice(boolean isBusy);

}

public class CEO implements 公司高層 {
ArrayList<Observer> observerList;
public CEO() {
observerList = new ArrayList<Observer>();
}
/**
* 允許蝦米們主動註冊成爲被忽悠的人羣中的一員
*/
public void add(Observer observer) {
observerList.add(observer);
}
/**
* 蝦米們覺醒了,決定把自己從被忽悠的人羣中清除
*/
public void del(Observer observer) {
observerList.remove(observer);
}
/**
* CEO所做的事件
*/
public void cancel() {
for (int i = 0; i < observerList.size(); i++) {
observerList.get(i).update("sorry! The meeting had bean canceled!");
}
}
/**
* CEO所做的事件
*/
public void normal() {
for (int i = 0; i < observerList.size(); i++) {
observerList.get(i).update("公司需要各位同仁,希望通過我們的努力創造公司美好的明天!");
}
}
/**
* 主動通知被忽悠的人
* isBusy CEO今天準備好忽悠員工沒有
*/
public void notice(boolean isBusy) {
if (isBusy) {
cancel();
} else {
normal();
}
}
}
 
被忽悠的人抽象(普通員工(蝦米))
public interface Observer {
public void update(String reason);
 
}
 
具體的職員:
public class Clerk implements Observer {
String name;
公司高層 subject;
public Clerk(String nameTo, 公司高層 subjectTo) {
this.name = nameTo;
this.subject = subjectTo;
subjectTo.add(this);
}
 
public void update(String reason) {
System.out.println(name + "聽到的內容是: " + reason);
}
}
 
 
場景類:
public class Client {
 
public static void main(String[] args) {
公司高層 s = new CEO();
Observer o1 = new Clerk("張1",s);
Observer o2 = new Clerk("張2", s);
Observer o3 = new Clerk("張3", s);
Observer o4 = new Clerk("張4", s);
s.notice(false);
}
 
}
運行結果爲:
張1聽到的內容是: 公司需要各位同仁,希望通過我們的努力創造公司美好的明天!
張2聽到的內容是: 公司需要各位同仁,希望通過我們的努力創造公司美好的明天!
張3聽到的內容是: 公司需要各位同仁,希望通過我們的努力創造公司美好的明天!
張4聽到的內容是: 公司需要各位同仁,希望通過我們的努力創造公司美好的明天!
 
 
public class Client {
 
public static void main(String[] args) {
公司高層 s = new CEO();
Observer o1 = new Clerk("張1",s);
Observer o2 = new Clerk("張2", s);
Observer o3 = new Clerk("張3", s);
Observer o4 = new Clerk("張4", s);
s.notice(true);
}
 
}
 
輸出爲:
張1聽到的內容是: sorry! The meeting had bean canceled!
張2聽到的內容是: sorry! The meeting had bean canceled!
張3聽到的內容是: sorry! The meeting had bean canceled!
張4聽到的內容是: sorry! The meeting had bean canceled!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章