话说2012年某某公司效益不是很好,没有按时给员工涨工资,很多有实力的员工都想着自己的付出和收获不成比例了,所以想跳槽,因为他们心里一直都有个阴影,因为公司效益好的时候他们也没见到太多的油水。公司高层认为员工应该跟公司共苦,但是员工认为 公司效益不好的时候我可以少拿钱,甚至不拿钱,但是公司效益好的时候是不是考虑多给我们一些,高层吃肉让我们喝点汤也是那么回事吧,但是事与愿违...言归正传 公司高层想在周末开一个员工动员大会,理论上想让公司员工都参加的,但是由于占用的是休息时间所以采取自愿形式,即员工想参加就可以参加员工不想参加也没关系,参加不参加员工自己说的算,但是大部分员工还是都对公司抱有希望的,想听一下公司给的解释,这就涉及到了一个设计模式 观察者模式(发布/订阅模式);

  观察者模式表述的是一个一对多关系,一表示被观察的 多表示所有观察者 在上面的案例中 公司的高层就是被观察这如CEO,公司的这帮员工(虾米、小兵)就是观察者,所有员工可以自己选择是否参加这次忽悠大会,也可以决定中途能不能离场。而CEO要做的是把自己的忽悠思想(画大饼)惯出给所有还留下来听他忽悠的“虾米”。综上表述,CEO应该持有很多个虾米的引用,因为他要灌输给他们谬论。而虾米们也应该持有高层的引用,因为他们自己能决定对高层的忽悠是否接受,不接受就撤了,接受就听着,这就涉及到了观察者能将自己注册到被观察者中,也能从被观察者把自己移除。类图如下:

 

设计模式之观察者模式(Observer)_设计模式之观察者模式

代码简介如下:

 

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!