您的位置:首页 > 其它

观察者模式学习A

2012-02-11 15:57 183 查看
观察者模式:

被观察者A--》间谍--》观察者。

它就像现在的国家与国家之间的谍情获取一样。

比如:A国家想知道B国家的总统每天做了些什么事,以方便获取此国家的某些秘密,那么A国家则向B国家的总统身边放了一个间谍C,每当B国家的总统做了些什么事(包括每天的吃饭、睡觉、活动)等,则向A国家报告。

。。。。

也许不单单是A国家想知道B国家的总统的事,可能D、E、F国家也想知道,因此它们也模仿A国家,同样向其放他们自己的间谍,以方便获取某些信息等。(呵呵,先卖个关子)

我采用了古代韩非子(代表B国家)与李斯(代表A国家)来作例子

下面我们来定义一些类来实现它。比如:韩非子吃早餐和活动。

首先定义一个接口IHanFeiZi

/**
*
*/
package com.nantian.designmodel.observer;

/**
* @author ps
*
*/
public interface IHanFeiZi {
/**
* 被观察者的吃早餐动作
*/
public void haveBreakfast();
/**
* 被观察者的活动
*/
public void haveFun();
}


再定义一个类HanFeiZi来实现它

/**
*
*/
package com.nantian.designmodel.observer;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* @author ps
*
*/
public class HanFeiZi implements IHanFeiZi {
protected static final Log log = LogFactory.getLog(HanFeiZi.class);
private ILiSi liSi;
public ILiSi getLiSi() {
return liSi;
}

public void setLiSi(ILiSi liSi) {
this.liSi = liSi;
}

/* (non-Javadoc)
* @see com.nantian.designmodel.observer.IHanFeiZi#haveBreakfast()
*/
@Override
public void haveBreakfast() {
log.info("韩非子吃早餐了,赶紧通知李斯");
liSi.update("报告李斯,他吃早餐了!");
log.info("报告完毕!");
}

/* (non-Javadoc)
* @see com.nantian.designmodel.observer.IHanFeiZi#haveFun()
*/
@Override
public void haveFun() {
log.info("韩非子出去活动了,赶紧通知李斯");
liSi.update("报告李斯,他吃早餐了!");
log.info("报告完毕!");
}

}


然后再看看李斯(代表A国家)怎么知道的。

定义一个接口ILiSi

/**
*
*/
package com.nantian.designmodel.observer;

/**
* @author ps
*
*/
public interface ILiSi {
/**
* 一旦发现被观察者有动情了,就该做点事了。
* @param str
*/
public void update(String str);
}


定义一个LiSi类来实现该接口

/**
*
*/
package com.nantian.designmodel.observer;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* @author ps
*
*/
public class LiSi implements ILiSi {
protected static final Log log = LogFactory.getLog(LiSi.class);
/* (non-Javadoc)
* @see com.nantian.designmodel.observer.ILiSi#update(java.lang.String)
*/
@Override
public void update(String str) {
log.info("收到!===" + str);
log.info("开始要做点事了!");
}

}


再定义一个客户端来运行它:

/**
*
*/
package com.nantian.designmodel.observer;

/**
* @author ps
*
*/
public class ObserverClient {

/**
* @param args
*/
public static void main(String[] args) {
LiSi lisi = new LiSi();
HanFeiZi hfz = new HanFeiZi();

hfz.setLiSi(lisi);

hfz.haveBreakfast();

hfz.haveFun();
}

}


所以都定义好后,再看看客户端是怎么运行的
运行结果:

二月 11, 2012 3:57:42 下午 com.nantian.designmodel.observer.HanFeiZi haveBreakfast
信息: 韩非子吃早餐了,赶紧通知李斯
二月 11, 2012 3:57:42 下午 com.nantian.designmodel.observer.LiSi update
信息: 收到!===报告李斯,他吃早餐了!
二月 11, 2012 3:57:42 下午 com.nantian.designmodel.observer.LiSi update
信息: 开始要做点事了!
二月 11, 2012 3:57:42 下午 com.nantian.designmodel.observer.HanFeiZi haveBreakfast
信息: 报告完毕!
二月 11, 2012 3:57:42 下午 com.nantian.designmodel.observer.HanFeiZi haveFun
信息: 韩非子出去活动了,赶紧通知李斯
二月 11, 2012 3:57:42 下午 com.nantian.designmodel.observer.LiSi update
信息: 收到!===报告李斯,他吃早餐了!
二月 11, 2012 3:57:42 下午 com.nantian.designmodel.observer.LiSi update
信息: 开始要做点事了!
二月 11, 2012 3:57:42 下午 com.nantian.designmodel.observer.HanFeiZi haveFun
信息: 报告完毕!


从结果可以看到韩非子一旦吃早餐,就有间谍来向李斯报告;同样一旦去活动了,再身李斯报告。

这样就实现了观察者与被观察者的关系。

但大家有没有发现,如果还有其他观察者呢?呵呵!在此先不说:则在下一篇分解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: