观察者模式又叫做发布-订阅模式,它根据被观察者触发的事件众多观察者执行相应的行为,前提是观察者必须向被观察者进行注册。目前流行的Spring、ZK、Mina、NIO、AWT、Swing等技术都大量使用了观察者模式。
下图为观察者模式涉及的角色
Java培训.png" width="500" height="232" >
孩子是一个被观察者,爸爸、妈妈、姐姐都是观察者,当被观察者触发一个事件(孩子醒来),多个观察者执行对应的行为(爸爸换尿布、妈妈喂吃的、姐姐喂水)。
相关代码如下:
package com.caojie.day38.observer;
public interface AbstractObserver {
public void action();
}
package com.caojie.day38.observer;
public interface AbstractObserverable {
public void register(AbstractObserver observer);
public void noticeEvent();
}
package com.caojie.day38.observer;
import java.util.ArrayList;
import java.util.List;
public class BabyObserverable implements AbstractObserverable{
private List list = new ArrayList<>();
@Override
public void register(AbstractObserver observer) {
list.add(observer);
}
@Override
public void noticeEvent() {
for(AbstractObserver oberver: list){
oberver.action();
}
}
}
package com.caojie.day38.observer;
import org.apache.log4j.Logger;
public class Father implements AbstractObserver {
private static final Logger logger = Logger.getLogger(Sister.class);
@Override
public void action() {
String msg ="小孩子醒来,爸爸为它换尿布";
if (logger.isInfoEnabled()) {
logger.info("action() - String msg=" + msg);
}
}
}
package com.caojie.day38.observer;
import org.apache.log4j.Logger;
public class Mather implements AbstractObserver {
private static final Logger logger = Logger.getLogger(Sister.class);
@Override
public void action() {
String msg ="小孩子醒来,妈妈为他倒水";
if (logger.isInfoEnabled()) {
logger.info("action() - String msg=" + msg);
}
}
}
package com.caojie.day38.observer;
import org.apache.log4j.Logger;
public class Sister implements AbstractObserver {
private static final Logger logger = Logger.getLogger(Sister.class);
@Override
public void action() {
String msg ="小孩子醒来,姐姐为他擦汗";
if (logger.isInfoEnabled()) {
logger.info("action() - String msg=" + msg);
}
}
}
package com.caojie.day38.observer;
public class Test {
public static void main(String[] args) {
AbstractObserverable observerable = new BabyObserverable();
AbstractObserver father = new Father();
AbstractObserver mather = new Mather();
AbstractObserver sister = new Sister();
//将观察者注入到被观察者中
observerable.register(father);
observerable.register(mather);
observerable.register(sister);
//小孩子触发一个事件,爸爸妈妈姐姐执行对应的行为
observerable.noticeEvent();
}
}
千锋成都Java培训作为国内IT研发人才一体化服务的开拓者,为学生制定合理有序的学习计划,0学费入学,2周免费试听不满意不收费,与学员签订就业协议,坚持良心面授,从千锋Java培训班出去的学员均已高薪就业。千锋推出的免费java视频教程,让学员能够方面的巩固基础技术能力。
相关文章



