设计模式(二)之观察者模式

观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的 所有依赖者都会收到通知并自动更新。

这个模式比较好懂,不过还是用个简单的例子来描述下,比如我们的博客,A君的博客写得很不错,B君想通过RSS订阅,以后每当A君有更新博客之后,B君就会收到最新的博文,有一天C君也发现了A君的博客,也订阅了,所以B、C君以后都会收到最新博客,但是B君订阅太多博客了,于是取消了A君的订阅,从此B君再也没收到A君最新的博文了。

例子中B、C君就是扮演观察者对象,而A君就像广播扮演一对多的角色。例子好像不怎么有趣,下面通过《妈妈与孩子们的午餐》并附上代码简单不抽象的来描述这个模式:

首先有个厨房,代码如下:

public interface Kitchen {public void register(Children child);public void remove(Children child);public void notifyChildren();}如你说见,Kitchen接口有三个方法,当有个孩子要吃饭的时候,就得到厨房跟妈妈说下,“我要吃饭”,那就得register一下,并把自己作为参数传进去,不然妈妈就不会煮你的份,如果你女朋友突然约了,你肯定得跟你妈妈说,我要出去,别煮我的份了吧,所以当然得有个remove方法,最后一个是当妈妈的饭菜准备完之后通知孩子们的方法。

妈妈是厨房的主人,因此得实现“厨房接口”,接下来看看Mother类:

public class Mother implements Kitchen{private ArrayList childrens;private String meal;private String vegetable;private String soup;public Mother() {childrens = new ArrayList<Children>();}@Overridepublic void register(Children child) {childrens.add(child);}@Overridepublic void remove(Children child) {int i = childrens.indexOf(child);if(i>=0) {childrens.remove(i);}}@Overridepublic void notifyChildren() {for(int i =0; i<childrens.size();i++) {Children children = (Children) childrens.get(i);children.notifyMenu(meal, vegetable, soup);}}public void canReadyEatting(String meal, String vegetable, String soup) {this.meal = meal;this.vegetable = vegetable;this.soup = soup;notifyChildren();}}因为妈妈的孩子不止只有一个,因此我们用到ArrayList,实现Kitchen类三个方法,其中Mother类拥有canReadyEatting()方法,一旦饭菜准备好,就会通知孩子饭餐准备好了。

现在我们看看孩子的接口,代码如下:

public interface Children {public void notifyMenu(String meal, String vegetable, String soup);}孩子的接口就一个方法,那就是等待通知饭菜做好了。当妈妈的饭菜做好之后,,就会通知孩子们,因此孩子的notifyMenu()方法会自动被调用。现在我们来具体化一个孩子类,那就是Brother类:public class Brother implements Children {private Mother mother;private String meal;private String vegetable;private String soup;public Brother(Mother mother) {this.mother = mother;mother.register(this);}@Overridepublic void notifyMenu(String meal, String vegetable, String soup) {System.out.println(meal+","+vegetable+","+soup+"都准备好了,可以吃饭了");}}Brother首先要实现Children,并实现notifyMenu()方法等待妈妈的通知,当然啦,在那之前肯定还得跟妈妈说下,我要吃饭。毕竟不是每个孩子都会收到妈妈的通知,因为那可能是别人家的孩子,因此得在构造函数中register()下。

然后我们看看测试代码:

public class Test {public static void main(String[] args) {Mother mother = new Mother();Brother brother = new Brother(mother);mother.canReadyEatting("猪肉","西洋菜","紫菜汤");}}看,每次妈妈煮好饭菜就调用canReadyEatting()来通知孩子们可以吃饭了,下面是打印结果:

哪里有意志存在,哪里就会有出路。

设计模式(二)之观察者模式

相关文章:

你感兴趣的文章:

标签云: