观察者模式又叫做发布-订阅模式,它根据被观察者触发的事件众多观察者执行相应的行为,前提是观察者必须向被观察者进行注册。目前流行的Spring、ZK、Mina、NIO、AWT、Swing等技术都大量使用了观察者模式。
下图为观察者模式涉及的角色
Java培训.png" width="500" height="232" style="border-width: initial; border-style: none; vertical-align: top; display: inline-block;">
孩子是一个被观察者,爸爸、妈妈、姐姐都是观察者,当被观察者触发一个事件(孩子醒来),多个观察者执行对应的行为(爸爸换尿布、妈妈喂吃的、姐姐喂水)。
相关代码如下:
package com.caojie.day38.observer;
/**
* @author caojie
* 观察者 爸爸 妈妈
*/
public interface AbstractObserver {
/**
* 被观察者触发一个事件观察者执行一系列行为
*/
public void action();
}
package com.caojie.day38.observer;
/**
* @author caojie
* 抽象被观察者(孩子)
*/
public interface AbstractObserverable {
/**
* 被观察者有一个注册的方法,将多个观察者注入到里面
* @param observer
*/
public void register(AbstractObserver observer);
/**
* 被观察者通知观察者执行
* 例如:小孩子醒来会触发此事件
*/
public void noticeEvent();
}
package com.caojie.day38.observer;
import java.util.ArrayList;
import java.util.List;
/**
* @author caojie
* 小孩子是一个具体被观察者
*/
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 {
/**
* Logger for this class
*/
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 {
/**
* Logger for this class
*/
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 {
/**
* Logger for this class
*/
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视频教程,让学员能够方面的巩固基础技术能力。
相关文章
更多推荐
Java技术之快速了解观察者模式
发布评论