您的位置:首页 > 其它

一个故事一个设计模式之观察者模式

2016-03-18 00:00 225 查看
摘要: 当一个对象被修改时,通知与其依赖的类做出相应的改变。这个时候我们需要一个通知的机制,可以实时把类的变化发给与之依赖的类。那如何知道与之依赖的类呢?我们可以在程序中把这些类添加到一个list中去,那么这些类如何进行回应呢?可以实现同一个接口,调用相同的应答方法(实现不同)。

很久很久以前,有一个小村庄,村子里住着张三,李四,王五和村长。他们日落而息,日出而作,过着幸福的小农生活。

村长

村长是一个十分尽职的人,每周都去十里远的镇里开会,他记得村里的每一个人,每次开会回来后,他就把会上的内容告诉村民们,然后记下村民们的反馈意见,以便下次开会的时候向上级反映他们的意见。

import java.util.ArrayList;
import java.util.List;

/**
* 这是村长的类
* @author n__n
*
*/
public class Cheif {

/**
* 村民的列表,村长有每个村民的信息
*/
private List<Villager> villagerList = new ArrayList<Villager>();

/**
* 村长登记村民,每个新到的村民调用这个方法即可被登记到村长的列表中去
* @param villager
*/
public void attach(Villager villager){
this.villagerList.add(villager);
}

/**
* 村长从镇上带来的信息
*/
private String message;

public String getMessage() {
return message;
}

/**
* 每次有新的信息,村长便会通知给各个村民知道
* @param message
*/
public void setMessage(String message) {
System.out.println("通知 " + message);
this.message = message;
notifyAllVillager();
}

/**
* 村长会挨家挨户的进行通知,并收集反馈
*/
private void notifyAllVillager(){
for(Villager vilager : villagerList){
System.out.println(vilager.feedback());
}
}
}

村民们

每次村长回来都会来寻求他们的意见,他们就会反馈意见。
/**
* 村民的抽象类
* @author n__n
*
*/
public abstract class Villager {

/**
* 村长,每个村民都知道村长是谁。
*/
protected Cheif cheif;

/**
* 当村长来访问时,每个村民会有自己的反馈意见
*/
abstract String feedback();
}

张三、李四和王五

/**
* 村民张三
* @author n__n
*
*/
class ZhangSan extends Villager{

/**
* 张三初到农村时报告村长进行登记
* @param cheif
*/
ZhangSan(Cheif cheif){
this.cheif = cheif;
this.cheif.attach(this);
}

@Override
String feedback() {
return "我是张三:哦";
}

}

/**
* 村民李四
* @author n__n
*
*/
class LiSi extends Villager{

/**
* 李四初到农村时报告村长进行登记
* @param cheif
*/
LiSi(Cheif cheif){
this.cheif = cheif;
this.cheif.attach(this);
}

@Override
String feedback() {
return "我是李四:嗯哼";
}

}

/**
* 村民王五
* @author n__n
*
*/
class WangWu extends Villager{

/**
* 王五初到农村时报告村长进行登记
* @param cheif
*/
WangWu(Cheif cheif){
this.cheif = cheif;
this.cheif.attach(this);
}

@Override
String feedback() {
return "我是王五:soga";
}

}

这个村子是这么运作的

public class Demo {

public static void main(String[] args) {
/**
* 村长任职
*/
Cheif cheif = new Cheif();

/**
* 村子里有张三
*/
ZhangSan zhangsan = new ZhangSan(cheif);

/**
* 村子里有李四
*/
LiSi lisi = new LiSi(cheif);

/**
* 村子里有王五
*/
WangWu wangwu = new WangWu(cheif);

String message = "上级关于二胎政策的通知";
/**
* 村长开会获得信息
*/
cheif.setMessage(message);
}
}

然后我们可以看到上面的main方法输出



这里的每个村民都是一个观察者,他们继承了抽象的村民类,亦即抽象的观察者类。继承该类会实现一个方法,上文是feedback(),获得通知后会调用该方法来更新自身或进行对应的操作。村长就是一个subject类,在发生变化时负责通知所有依赖的类。村民本来是观察上级政策来调整自己的生产行动的,假如没有村长,他们就每个都要去开会,要是每个村民都去开会,那么镇里的会议室就会很拥挤,镇里肯定还要包个午餐什么的吧,也增加了很多开销,有了村长以后,可以只让村长去开会,村长获得信息后再通知各个村民。镇里面就轻松多了,村民也不用去大老远跑去镇里开会。

后来,张三和李四好上了,王五和村长好上了,然后村子灭亡了。

The End
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: