观察者模式定义了一种一对多的依赖关系.
简单的解释就是多个观察者对象,一同观察某个主题对象,并随着主题对象的更新,而各自进行相应的更新.
举个例子,动物园里饲养员是一个主题对象,而这个饲养员所喂养的动物,就是一个个的观察者对象.
在这个例子中的饲养员比较奇葩,他对它所喂养的动物,统一喂同一种食物,虽然动物不得不吃这些食物,但对这种食物都有着各自的看法.
首先我们知道,所有的饲养员,虽然性格不同,但是,他们必须都要有饲养员应该有的素质,这样才有资格成为一个饲养员.所以,我们首先要定义一个接口,来规范一下我们的饲养员.
public interface Siyangyuan {
public void addAnimal(Animal a);
public void deleteAnimal(Animal a);
public void feedAnimal(String str);
}
动物园里有许多的动物,动物都是要吃饭的,而饲养员的首要任务,就是要让动物吃饱,喝好,健康快乐的成长。我们接收的动物,也是有一定的要求的,就是,都要会吃。吃完,还得要会说出改进意见。我们规范一下动物们。
public interface Animal {
public void eat(String o);
}
然后,这里有几个小动物。
这是猪
public class Pig implements Animal {
public void eat(String o) {
System.out.println("猪:什么我都喜欢吃,"+o+"我也不介意!可以再来两个!");
}
}
这是绵羊
public class Sheep implements Animal {
public void eat(String o) {
System.out.println("羊:这个饲养员喂得东西太难吃了,再给我"+o+"我就要求换人!");
}
}
这是老虎
public class Tiger implements Animal {
public void eat(String o) {
System.out.println("虎:整天喂我吃像"+o+"这样的没营养的东西,我要吃的是你!饲养员!");
}
}
这几只动物还是很有性格的,每个人对于每天所吃的东西,所要表达的情感还是有很大的差距的。不过说归说,每次饲养员喂东西还都是乖乖的吃。毕竟,还是要活命的吗。
下边是我们根据上述的要求,聘请的一位饲养员,小李
public class Xiaoli implements Siyangyuan {
private List<Animal> list = new ArrayList<Animal>();//用来记录饲养员管理的动物种类
public void addAnimal(Animal a) {
list.add(a);
}
public void deleteAnimal(Animal a) {
list.remove(a);
}
public void feedAnimal(String str) {
for (Animal a:list ){
a.eat(str);
}
}
}
如你所见,我们的小李很能干,可以接受新动物,也可以送出不喜欢的动物,关键是,任劳任怨的给每个接收过来的动物喂食。
这样以后的事情,就简单了。
当然,还可以多招一个饲养员,每个饲养员喂养动物的食物不同,让各个动物根据自己的口味,自行选择想要跟随的饲养员。
另外再说一句,各大平台实时跟随气象台更新天气预报的例子,也是这种模式的体现。